diff --git a/.github/workflows/aks_deploy.yml b/.github/workflows/aks_deploy.yml index 0274539..46abe72 100644 --- a/.github/workflows/aks_deploy.yml +++ b/.github/workflows/aks_deploy.yml @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-latest env: - ORDNANCE_SURVEY_API_KEY: someapikey + ORDNANCE_SURVEY_API_KEY: geocoderkey services: postgres: diff --git a/Gemfile b/Gemfile index 18171e7..8e676ab 100644 --- a/Gemfile +++ b/Gemfile @@ -31,6 +31,7 @@ end group :test do # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] gem "capybara" + gem "capybara-screenshot" gem "selenium-webdriver" gem "shoulda-matchers" gem "webdrivers" @@ -47,4 +48,6 @@ group :test, :development do gem "brakeman", require: false gem "debug", platforms: %i[ mri mingw x64_mingw ] gem 'rubocop-govuk', require: false + gem 'vcr' + gem 'webmock' end diff --git a/Gemfile.lock b/Gemfile.lock index 55bd68e..392db43 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -72,6 +72,7 @@ GEM addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) ast (2.4.2) + bigdecimal (3.1.6) bindex (0.8.1) bootsnap (1.18.3) msgpack (~> 1.2) @@ -88,8 +89,14 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) + capybara-screenshot (1.0.26) + capybara (>= 1.0, < 4) + launchy coderay (1.1.3) concurrent-ruby (1.2.3) + crack (1.0.0) + bigdecimal + rexml crass (1.0.6) cssbundling-rails (1.4.0) railties (>= 6.0.0) @@ -115,6 +122,7 @@ GEM activemodel (>= 6.1) activesupport (>= 6.1) html-attributes-utils (~> 1) + hashdiff (1.1.0) html-attributes-utils (1.0.2) activesupport (>= 6.1.4.4) i18n (1.14.1) @@ -127,6 +135,8 @@ GEM railties (>= 6.0.0) json (2.7.1) language_server-protocol (3.17.0.3) + launchy (2.5.2) + addressable (~> 2.8) loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -295,6 +305,7 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) + vcr (6.2.0) view_component (3.9.0) activesupport (>= 5.2.0, < 8.0) concurrent-ruby (~> 1.0) @@ -308,6 +319,10 @@ GEM nokogiri (~> 1.6) rubyzip (>= 1.3.0) selenium-webdriver (~> 4.0, < 4.11) + webmock (3.23.0) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) websocket (1.2.10) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) @@ -328,6 +343,7 @@ DEPENDENCIES bundler (~> 2.4) byebug capybara + capybara-screenshot cssbundling-rails debug dotenv-rails @@ -351,8 +367,10 @@ DEPENDENCIES selenium-webdriver shoulda-matchers tzinfo-data + vcr web-console webdrivers + webmock RUBY VERSION ruby 3.1.2p20 diff --git a/README.md b/README.md index a63b37a..e97ea5d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,14 @@ This project depends on: When updating the `db/data/hubs.csv` file, please make sure to run `rails r 'Hub::Importer.new.reload!'` locally first to make sure all changes were applied. +## Testing + +### Mocking with VCR for feature specs + +Your default test geocoder key should be `ORDNANCE_SURVEY_API_KEY='geocoderkey'`, and its VERY IMPORTANT not to leak +key to the repository. This key is being set in github actions as well. +Every time you re-record VCR cassete, you need to modify the key. + ### Linting To run the linters: diff --git a/app/lib/local_authority/search.rb b/app/lib/local_authority/search.rb index 11e6443..9c34aab 100644 --- a/app/lib/local_authority/search.rb +++ b/app/lib/local_authority/search.rb @@ -25,7 +25,6 @@ def geo_result def search_polygon return @search_polygon if defined? @search_polygon - #binding.pry json = geo_result && geo_result.data['geojson'] return @search_polygon = nil unless json diff --git a/package.json b/package.json index 02841cd..1b232b7 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "dependencies": { "esbuild": "^0.17.19", "govuk-frontend": "4.6.0", - "sass": "^1.62.1" + "sass": "^1.62.1", + "yarn": "^1.22.21" }, "scripts": { "build:css": "sass ./app/assets/stylesheets/application.sass.scss:./app/assets/builds/application.css --no-source-map --load-path=node_modules --quiet-deps", diff --git a/spec/features/happy_path_spec.rb b/spec/features/happy_path_spec.rb new file mode 100644 index 0000000..b140ebf --- /dev/null +++ b/spec/features/happy_path_spec.rb @@ -0,0 +1,24 @@ +require "rails_helper" + +RSpec.feature "Happy path", type: :feature do + before do + LocalAuthority::Importer.new.reload! + Hub::Importer.new.reload! + end + + let(:expected_hubs_names) do + ["Chiltern Teaching School Hub", "Chiltern Teaching School Hub", "Alban Teaching School Hub"] + end + + scenario "Performs search" do + VCR.use_cassette("geocoder") do + visit root_path + click_link("Start now") + expect(page).to have_text("Where do you want to find teaching school hubs?") + fill_in "Where do you want to find teaching school hubs?", with: "Luton" + click_button('Continue') + hubs = all('h3 a').map(&:text) + expect(hubs).to eq(expected_hubs_names) + end + end +end diff --git a/spec/fixtures/vcr_cassettes/geocoder.yml b/spec/fixtures/vcr_cassettes/geocoder.yml new file mode 100644 index 0000000..c012404 --- /dev/null +++ b/spec/fixtures/vcr_cassettes/geocoder.yml @@ -0,0 +1,154 @@ +--- +http_interactions: +- request: + method: get + uri: https://api.os.uk/search/names/v1/find?fq=local_type:City%20local_type:Hamlet%20local_type:Other_Settlement%20local_type:Town%20local_type:Village%20local_type:Postcode&key=geocoderkey&query=Luton,%20UK + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Date: + - Thu, 07 Mar 2024 11:38:15 GMT + Content-Type: + - application/json;charset=UTF-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Expires: + - '0' + Pragma: + - no-cache + X-Content-Type-Options: + - nosniff + Vary: + - Origin,Accept-Encoding,key + Omse-Category: + - open + Omse-Transaction-Count: + - '60' + Omse-Premium-Count: + - '0' + Access-Control-Allow-Origin: + - "*" + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Headers: + - origin, x-requested-with, accept, key, authorization, content-type + Access-Control-Max-Age: + - '3628800' + Access-Control-Allow-Methods: + - GET, POST + Strict-Transport-Security: + - max-age=31536000; includeSubDomains + body: + encoding: UTF-8 + string: |- + { + "header" : { + "uri" : "https://api.os.uk/search/names/v1/find?fq=local_type%3ACity%20local_type%3AHamlet%20local_type%3AOther_Settlement%20local_type%3ATown%20local_type%3AVillage%20local_type%3APostcode&query=Luton%2C%20UK", + "query" : "Luton, UK", + "format" : "JSON", + "maxresults" : 100, + "offset" : 0, + "totalresults" : 3, + "filter" : "fq=local_type:City local_type:Hamlet local_type:Other_Settlement local_type:Town local_type:Village local_type:Postcode" + }, + "results" : [ { + "GAZETTEER_ENTRY" : { + "ID" : "osgb4000000074572547", + "NAMES_URI" : "http://data.ordnancesurvey.co.uk/id/4000000074572547", + "NAME1" : "Luton", + "TYPE" : "populatedPlace", + "LOCAL_TYPE" : "Town", + "GEOMETRY_X" : 509031.0, + "GEOMETRY_Y" : 221292.0, + "MOST_DETAIL_VIEW_RES" : 74000, + "LEAST_DETAIL_VIEW_RES" : 2000000, + "MBR_XMIN" : 501743.0, + "MBR_YMIN" : 219219.0, + "MBR_XMAX" : 513063.0, + "MBR_YMAX" : 226739.0, + "POSTCODE_DISTRICT" : "LU1", + "POSTCODE_DISTRICT_URI" : "http://data.ordnancesurvey.co.uk/id/postcodedistrict/LU1", + "COUNTY_UNITARY" : "Luton", + "COUNTY_UNITARY_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000037536", + "COUNTY_UNITARY_TYPE" : "http://data.ordnancesurvey.co.uk/ontology/admingeo/UnitaryAuthority", + "REGION" : "Eastern", + "REGION_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000041425", + "COUNTRY" : "England", + "COUNTRY_URI" : "http://data.ordnancesurvey.co.uk/id/country/england", + "SAME_AS_GEONAMES" : "http://sws.geonames.org/2643339" + } + }, { + "GAZETTEER_ENTRY" : { + "ID" : "osgb4000000074555115", + "NAMES_URI" : "http://data.ordnancesurvey.co.uk/id/4000000074555115", + "NAME1" : "Luton", + "TYPE" : "populatedPlace", + "LOCAL_TYPE" : "Hamlet", + "GEOMETRY_X" : 290123.0, + "GEOMETRY_Y" : 76949.0, + "MOST_DETAIL_VIEW_RES" : 5000, + "LEAST_DETAIL_VIEW_RES" : 25000, + "MBR_XMIN" : 289842.0, + "MBR_YMIN" : 76681.0, + "MBR_XMAX" : 290379.0, + "MBR_YMAX" : 77181.0, + "POSTCODE_DISTRICT" : "TQ13", + "POSTCODE_DISTRICT_URI" : "http://data.ordnancesurvey.co.uk/id/postcodedistrict/TQ13", + "DISTRICT_BOROUGH" : "Teignbridge", + "DISTRICT_BOROUGH_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000022881", + "DISTRICT_BOROUGH_TYPE" : "http://data.ordnancesurvey.co.uk/ontology/admingeo/District", + "COUNTY_UNITARY" : "Devon", + "COUNTY_UNITARY_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000023147", + "COUNTY_UNITARY_TYPE" : "http://data.ordnancesurvey.co.uk/ontology/admingeo/County", + "REGION" : "South West", + "REGION_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000041427", + "COUNTRY" : "England", + "COUNTRY_URI" : "http://data.ordnancesurvey.co.uk/id/country/england", + "SAME_AS_GEONAMES" : "http://sws.geonames.org/2643340" + } + }, { + "GAZETTEER_ENTRY" : { + "ID" : "osgb4000000074575309", + "NAMES_URI" : "http://data.ordnancesurvey.co.uk/id/4000000074575309", + "NAME1" : "Luton", + "TYPE" : "populatedPlace", + "LOCAL_TYPE" : "Hamlet", + "GEOMETRY_X" : 308265.0, + "GEOMETRY_Y" : 102797.0, + "MOST_DETAIL_VIEW_RES" : 5000, + "LEAST_DETAIL_VIEW_RES" : 25000, + "MBR_XMIN" : 307858.0, + "MBR_YMIN" : 102576.0, + "MBR_XMAX" : 308374.0, + "MBR_YMAX" : 103076.0, + "POSTCODE_DISTRICT" : "EX14", + "POSTCODE_DISTRICT_URI" : "http://data.ordnancesurvey.co.uk/id/postcodedistrict/EX14", + "DISTRICT_BOROUGH" : "East Devon", + "DISTRICT_BOROUGH_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000022713", + "DISTRICT_BOROUGH_TYPE" : "http://data.ordnancesurvey.co.uk/ontology/admingeo/District", + "COUNTY_UNITARY" : "Devon", + "COUNTY_UNITARY_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000023147", + "COUNTY_UNITARY_TYPE" : "http://data.ordnancesurvey.co.uk/ontology/admingeo/County", + "REGION" : "South West", + "REGION_URI" : "http://data.ordnancesurvey.co.uk/id/7000000000041427", + "COUNTRY" : "England", + "COUNTRY_URI" : "http://data.ordnancesurvey.co.uk/id/country/england" + } + } ] + } + recorded_at: Thu, 07 Mar 2024 11:38:13 GMT +recorded_with: VCR 6.2.0 diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 56c9cb3..372c7d5 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -5,6 +5,11 @@ abort("The Rails environment is running in production mode!") if Rails.env.production? require 'rspec/rails' +VCR.configure do |config| + config.cassette_library_dir = "spec/fixtures/vcr_cassettes" + config.hook_into :webmock +end + begin ActiveRecord::Migration.maintain_test_schema! rescue ActiveRecord::PendingMigrationError => e diff --git a/yarn.lock b/yarn.lock index 6c2c080..e724224 100644 --- a/yarn.lock +++ b/yarn.lock @@ -79,7 +79,7 @@ "@esbuild/linux-x64@0.17.19": version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz" integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== "@esbuild/netbsd-x64@0.17.19": @@ -121,7 +121,7 @@ anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -129,19 +129,19 @@ anymatch@~3.1.2: binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" "chokidar@>=3.0.0 <4.0.0": version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -156,7 +156,7 @@ braces@~3.0.2: esbuild@^0.17.19: version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== optionalDependencies: "@esbuild/android-arm" "0.17.19" @@ -184,65 +184,65 @@ esbuild@^0.17.19: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" govuk-frontend@4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/govuk-frontend/-/govuk-frontend-4.6.0.tgz#662b41f7c468bb5468441218c720f0b31c948cbd" + resolved "https://registry.npmjs.org/govuk-frontend/-/govuk-frontend-4.6.0.tgz" integrity sha512-pLJVHVvfsTmNDBH/YBCMyuqSMCQmOrNQXoThdcAzhXJVbuaWnGc1URvjOR7EJeZyOm101fHDjzTkTvpEy6zfiw== immutable@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== prettier@>=3.0.0: @@ -252,19 +252,19 @@ prettier@>=3.0.0: prettier@^2.8.8: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" sass@^1.62.1: version "1.62.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" + resolved "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz" integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -273,12 +273,17 @@ sass@^1.62.1: "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" + +yarn@^1.22.21: + version "1.22.21" + resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.21.tgz" + integrity sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg==