From 498a14d2df028ec402127c6453b5c25652b527b5 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 11 Sep 2024 13:14:08 -0400 Subject: [PATCH 01/24] Add redirects --- static/_redirects | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/static/_redirects b/static/_redirects index d694bb9ca..4315584e9 100644 --- a/static/_redirects +++ b/static/_redirects @@ -1 +1,19 @@ /maxmind-server-ip-addresses.xml /maxmind-server-ip-addresses/index.xml 302 +/GeoIP2-Enterprise-CSV_Example.zip /static/GeoIP2-Enterprise-CSV_Example.zip 301 +/fips-iso-map.csv /static/csv/fips-iso-map.csv 301 +/geoip-test-databases.tar.gz /static/geoip-test-databases.tar.gz 301 +/checksum.txt /static/checksum.txt 301 +/csv-files/:file /static/csv/:file 301 +/static/csv/codes/eu_country_list.csv /static/csv/codes/maxmind/eu_country_list.csv 301 +/static/csv/codes/ap_country_list.csv /static/csv/codes/maxmind/ap_country_list.csv 301 +/csv-files/:file /static/csv/:file 301 +/csv/:files /static/csv/:file 301 +/static/pdfs/:files /static/pdf/:file 301 +/minfraud-soap-*.wsdl /sattic/wsdl/minfraud-soap-:splat.wsdl 301 +/static/maxmind-region-codes.csv https://download.maxmind.com/download/geoip/misc/region_codes.csv 301 + +# The year needs to be hardcoded. A page for the new year's +# release note won't exist until a new .md file is created in the +# /content//release-notes folder for that new year +/geoip/release-notes /geoip/release-notes/2024 +/minfraud/release-notes /minfraud/release-notes/2024 From a0f218cf4bebaba7914d4d392c3b9fcde5e41b77 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 11 Sep 2024 15:07:25 -0400 Subject: [PATCH 02/24] Delete navigation.tsx --- content/navigation.tsx | 229 ----------------------------------------- 1 file changed, 229 deletions(-) delete mode 100644 content/navigation.tsx diff --git a/content/navigation.tsx b/content/navigation.tsx deleted file mode 100644 index 9d3bfcf81..000000000 --- a/content/navigation.tsx +++ /dev/null @@ -1,229 +0,0 @@ -import React from 'react'; - -import ProductIcon from '../src/components/ProductIcon'; -import { IItem } from '../src/types/Item'; - -const navigation: IItem[] = [ - { - icon: ( - - ), - items: [ - { - title: 'Evaluate a Transaction', - to: '/minfraud/evaluate-a-transaction', - }, - { - title: 'Report a Transaction', - to: '/minfraud/report-a-transaction', - }, - { - title: 'Track Devices', - to: '/minfraud/track-devices', - }, - { - title: 'minFraud Alerts', - to: '/minfraud/alerts', - }, - { - title: 'Working with Transaction Dispositions', - to: '/minfraud/working-with-transaction-dispositions', - }, - { - hasDivider: true, - secondaryItems: [ - { - title: 'Requests', - to: '/minfraud/api-documentation/requests', - }, - { - title: 'Responses', - to: '/minfraud/api-documentation/responses', - }, - ], - title: 'API Documentation', - to: '/minfraud/api-documentation', - }, - // The year needs to be hardcoded. A page for the new year's - // release notes won't exist until a new MDX file is created - // in the /content//release-notes folder for that new year. - { - hasDivider: true, - title: 'Release Notes', - to: '/minfraud/release-notes/2024', - }, - { - title: 'Sandbox Environment', - to: '/minfraud/sandbox-environment', - }, - { - title: 'Contribute', - to: '/contribute', - }, - { - title: 'minFraud Legacy', - to: '/minfraud/minfraud-legacy', - }, - { - title: 'Proxy Detection Legacy Web Service', - to: '/minfraud/proxy-detection', - }, - { - title: 'MaxMind Server IP Addresses', - to: '/maxmind-server-ip-addresses', - }, - { - title: 'Knowledge Base', - url: 'https://support.maxmind.com/hc/en-us/categories/1260801482329-minFraud-Web-Services', - }, - ], - title: 'minFraud', - to: '/minfraud', - }, - { - icon: ( - - ), - items: [ - { - items: [ - { - title: 'Databases', - to: '/geoip/geolocate-an-ip/databases', - }, - { - title: 'Web Services', - to: '/geoip/geolocate-an-ip/web-services', - }, - { - title: 'Client-side JavaScript', - to: '/geoip/geolocate-an-ip/client-side-javascript', - }, - ], - title: 'Geolocate an IP', - to: '/geoip/geolocate-an-ip', - }, - { - title: 'Updating Databases', - to: '/geoip/updating-databases', - }, - { - items: [ - { - title: 'Import to PostgreSQL', - to: '/geoip/importing-databases/postgresql', - }, - { - title: 'Import to MySQL', - to: '/geoip/importing-databases/mysql', - }, - ], - title: 'Importing Databases', - to: '/geoip/importing-databases', - }, - { - title: 'GeoLite2 Free Geolocation Data', - to: '/geoip/geolite2-free-geolocation-data', - }, - { - title: 'Privacy Exclusions API', - to: '/geoip/privacy-exclusions-api', - }, - { - hasDivider: true, - secondaryItems: [ - { - title: 'Requests', - to: '/geoip/docs/web-services/requests', - }, - { - title: 'Responses', - to: '/geoip/docs/web-services/responses', - }, - { - title: 'Sandbox Environment', - to: '/geoip/docs/web-services/sandbox-environment', - }, - { - title: 'Legacy Web Services', - to: '/geoip/docs/web-services/legacy', - }, - ], - title: 'Web Services Documentation', - to: '/geoip/docs/web-services', - }, - { - secondaryItems: [ - { - title: 'City and Country', - to: '/geoip/docs/databases/city-and-country', - }, - { - title: 'Enterprise', - to: '/geoip/docs/databases/enterprise', - }, - { - title: 'Anonymous IP', - to: '/geoip/docs/databases/anonymous-ip', - }, - { - title: 'ISP', - to: '/geoip/docs/databases/isp', - }, - { - title: 'Connection Type', - to: '/geoip/docs/databases/connection-type', - }, - { - title: 'Domain', - to: '/geoip/docs/databases/domain', - }, - { - title: 'ASN', - to: '/geoip/docs/databases/asn', - }, - ], - title: 'Database Documentation', - to: '/geoip/docs/databases', - }, - // The year needs to be hardcoded. A page for the new year's - // release notes won't exist until a new MDX file is created - // in the /content//release-notes folder for that new year. - { - hasDivider: true, - title: 'Release Notes', - to: '/geoip/release-notes/2024', - }, - { - title: 'Contribute', - to: '/contribute', - }, - { - title: 'MaxMind Server IP Addresses', - to: '/maxmind-server-ip-addresses', - }, - { - title: 'License Key Validation API', - to: '/license-key-validation-api', - }, - { - title: 'Knowledge Base', - url: 'https://support.maxmind.com/hc/en-us/categories/1260801446650-GeoIP2-and-GeoLite2', - }, - { - title: 'MMDB Format Spec', - url: 'https://maxmind.github.io/MaxMind-DB/', - }, - ], - title: 'GeoIP2 and GeoLite2', - to: '/geoip', - }, -]; - -export default navigation; From 9a15848221c8e128f4e27dfd382453d3299c4ab0 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Thu, 12 Sep 2024 12:34:55 -0400 Subject: [PATCH 03/24] Migrate GeoIP release notes + create RSS feed --- assets/scss/_release-note.scss | 9 ++ assets/scss/index.scss | 1 + .../geoip/release-notes/{2013.mdx => 2013.md} | 28 ++-- .../geoip/release-notes/{2014.mdx => 2014.md} | 28 ++-- .../geoip/release-notes/{2015.mdx => 2015.md} | 28 ++-- .../geoip/release-notes/{2016.mdx => 2016.md} | 20 +-- .../geoip/release-notes/{2017.mdx => 2017.md} | 48 +++--- .../geoip/release-notes/{2018.mdx => 2018.md} | 32 ++-- .../geoip/release-notes/{2019.mdx => 2019.md} | 112 +++++++------- .../geoip/release-notes/{2020.mdx => 2020.md} | 116 +++++++-------- .../geoip/release-notes/{2021.mdx => 2021.md} | 92 ++++++------ .../geoip/release-notes/{2022.mdx => 2022.md} | 120 +++++++-------- .../geoip/release-notes/{2023.mdx => 2023.md} | 140 +++++++++--------- .../geoip/release-notes/{2024.mdx => 2024.md} | 100 ++++++------- layouts/release-note/rss.xml | 56 +++++++ layouts/shortcodes/release-note.html | 17 +++ 16 files changed, 516 insertions(+), 431 deletions(-) create mode 100644 assets/scss/_release-note.scss rename content/geoip/release-notes/{2013.mdx => 2013.md} (71%) rename content/geoip/release-notes/{2014.mdx => 2014.md} (85%) rename content/geoip/release-notes/{2015.mdx => 2015.md} (81%) rename content/geoip/release-notes/{2016.mdx => 2016.md} (85%) rename content/geoip/release-notes/{2017.mdx => 2017.md} (79%) rename content/geoip/release-notes/{2018.mdx => 2018.md} (81%) rename content/geoip/release-notes/{2019.mdx => 2019.md} (81%) rename content/geoip/release-notes/{2020.mdx => 2020.md} (82%) rename content/geoip/release-notes/{2021.mdx => 2021.md} (87%) rename content/geoip/release-notes/{2022.mdx => 2022.md} (87%) rename content/geoip/release-notes/{2023.mdx => 2023.md} (87%) rename content/geoip/release-notes/{2024.mdx => 2024.md} (87%) create mode 100644 layouts/release-note/rss.xml create mode 100644 layouts/shortcodes/release-note.html diff --git a/assets/scss/_release-note.scss b/assets/scss/_release-note.scss new file mode 100644 index 000000000..4b73b85dd --- /dev/null +++ b/assets/scss/_release-note.scss @@ -0,0 +1,9 @@ +.release-note { + margin-bottom: calc(var(--mm-spacing) * 1.5); +} + +.release-note__date { + display: block; + font-style: italic; + margin-bottom: calc(var(--mm-spacing) / 2); +} diff --git a/assets/scss/index.scss b/assets/scss/index.scss index 49b35cd70..85c79645b 100644 --- a/assets/scss/index.scss +++ b/assets/scss/index.scss @@ -22,6 +22,7 @@ @import 'link-group'; @import 'tag'; @import 'schema'; +@import 'release-note'; *:focus { outline-color: var(--mm-color-logo-blue-light); diff --git a/content/geoip/release-notes/2013.mdx b/content/geoip/release-notes/2013.md similarity index 71% rename from content/geoip/release-notes/2013.mdx rename to content/geoip/release-notes/2013.md index 1a1f3af6b..9682e4846 100644 --- a/content/geoip/release-notes/2013.mdx +++ b/content/geoip/release-notes/2013.md @@ -1,9 +1,11 @@ --- draft: false title: GeoIP2 Release Notes - 2013 Archive +type: release-note +outputs: ['html', 'rss'] --- - +{{< release-note date="2013-08-12" title="Canadian Postals back in database" >}} Canadian postal codes are included in the GeoIP City databases again. We now return the first 3 characters of the postal for Canada. We have also increased postal coverage for Australia, France, Spain, and Switzerland @@ -20,17 +22,17 @@ The postal code coverage is approximately: - Switzerland, 38% - United Kingdom, 9% - United States, 56% +{{}} - - +{{< release-note date="2013-08-06" title="GeoIP release delay" >}} The Tuesday, August 6, GeoIP update is delayed one day. The databases should be available by 6pm US Eastern time on Wednesday, August 7th. We apologize for the delay. - +{{}} - -he GeoIP databases now returns more postal codes for Australia, France, +{{< release-note date="2013-07-24" title="Improved international postal resolution" >}} +GeoIP databases now return more postal codes for Australia, France, Germany, Italy, Spain, South Africa, Switzerland, and United Kingdom. In addition, the latitude and longitude will reflect the center of the postal code instead of the center of the city for these countries. The postal code coverage @@ -47,25 +49,25 @@ is approximately: - United States, 56% On July 30th, the GeoIP databases should return postals for Canada. +{{}} - - +{{< release-note date="2013-07-08" title="GeoLite2 City Database Available" >}} The [GeoLite2 City database](/geoip/geoip2/geolite2/ "GeoLite2 Free Downloadable Databases") is now available for download. This is the first database available in our new [MaxMind DB format](https://github.com/maxmind/MaxMind-DB "MaxMind DB GitHub repository"). - +{{}} - +{{< release-note date="2013-07-05" title="GeoIP2 Precision Data Available" >}} The GeoIP2 Web Services now use more accurate GeoIP2 precision data. Testing shows the GeoIP2 precision data accurately geolocates 1.6% more IPs to US postal codes than GeoIP Legacy data. GeoIP2 precision data is available only in GeoIP2 City/ISP/Organization and GeoIP Omni Web Services. - +{{}} - +{{< release-note date="2013-05-01" title="GeoIP2 Now Available" >}} The GeoIP2 JavaScript service is now available. This is the first publicly available GeoIP2-based service. - +{{}} diff --git a/content/geoip/release-notes/2014.mdx b/content/geoip/release-notes/2014.md similarity index 85% rename from content/geoip/release-notes/2014.mdx rename to content/geoip/release-notes/2014.md index 3a81be689..53b81f3fb 100644 --- a/content/geoip/release-notes/2014.mdx +++ b/content/geoip/release-notes/2014.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2014 Archive --- - +{{< release-note date="2014-12-16" title="More IPs mapped to postal codes" >}} As part of our ongoing work to return more data, MaxMind has increased the number of IP addresses that map to a postal code. @@ -26,9 +26,9 @@ Malaysia, Mexico, Netherlands, New Zealand, Norway, Pakistan, Poland, Portugal, Russia, Slovakia, South Africa, Spain, Sweden, Switzerland, Thailand, United Kingdom, United States. - +{{}} - +{{< release-note date="2014-11-25" title="Improvements to accuracy in Japan, South Korea and Venezuela and change in lat/lon returned" >}} We have improved the coverage and accuracy for GeoIP City in Japan, South Korea and Venezuela. We expect to make further improvements to the accuracy in South Korea over the next few weeks. @@ -40,9 +40,9 @@ Iran, Netherlands, Norway, Peru, Philippines, Poland, Portugal, Russia, Sweden, Thailand, Turkey, Ukraine, we will return a latitude and longitude of the largest city in the country. - +{{}} - +{{< release-note date="2014-11-19" title="Free JavaScript service discontinued" >}} We have disabled the free JavaScript GeoIP service. If you were using the free JavaScript service and wish to continue service, you @@ -60,9 +60,9 @@ Upgrading to the GeoIP2 JavaScript API comes with several benefits: - Location names in eight popular languages - Support for IPv6 addresses - +{{}} - +{{< release-note date="2014-07-18" title="GeoIP2 JavaScript v2.1" >}} MaxMind released version 2.1 of our JavaScript API. Changes: - This release updates the API to use version 2.1 of our GeoIP2 web service. @@ -79,9 +79,9 @@ To upgrade, please use the new JavaScript file specified in our Users of version 2.0 are not affected, but they are encouraged to update to the new version. Only serious functionality issues will be fixed in version 2.0. - +{{}} - +{{< release-note date="2014-07-18" title="GeoIP2 Web Service v2.1" >}} MaxMind has released version 2.1 of the GeoIP2 web service. Changes include: @@ -99,22 +99,22 @@ To upgrade, please use the updated service URIs specified in our For the version 2.0 endpoints, the City endpoint will now include ISP/Org data. The other output for the 2.0 endpoints was unchanged. - +{{}} - +{{< release-note date="2014-04-01" title="Type Change to GeoIP2 Metro Code Field" >}} In previous GeoIP2 databases, the `metro_code` was incorrectly represented as a string. This has been corrected and now `metro_code` is internally represented as an `uint16`. This should not affect users of the official Java, .NET, Perl, or PHP GeoIP2 APIs. The Python API will now return an integer rather than a string for `metro_code`. Users of libmaxminddb or third-party APIs may be affected. - +{{}} - +{{< release-note date="2014-01-21" title="Free use of the GeoIP2 JavaScript API has been discontinued" >}} In order to focus our efforts on providing the best IP data to our customers, MaxMind has discontinued free use of the GeoIP2 JavaScript API. To continue using the API, you will need to purchase [GeoIP2 Web Service](https://www.maxmind.com/en/geoip2-precision-services) lookups. Individuals unable to purchase services are encouraged to use our free GeoLite2 Country or City databases. - +{{}} diff --git a/content/geoip/release-notes/2015.mdx b/content/geoip/release-notes/2015.md similarity index 81% rename from content/geoip/release-notes/2015.mdx rename to content/geoip/release-notes/2015.md index 1603c2eba..1c2c3b7fd 100644 --- a/content/geoip/release-notes/2015.mdx +++ b/content/geoip/release-notes/2015.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2015 Archive --- - +{{< release-note date="2015-11-17" title="libmaxminddb 1.1.2" >}} MaxMind has released libmaxminddb 1.1.2, which includes a number of important security fixes. Among these fixes is improved validation of the database metadata. Unfortunately, MaxMind GeoIP2 and GeoLite2 databases created earlier @@ -13,17 +13,17 @@ libmaxminddb but did not work on big endian machines. Due to increased safety checks when reading the file, these databases will no longer work on any platform. If you are using one of these databases, we recommend that you upgrade to the latest GeoLite2 or GeoIP2 database. - +{{}} - +{{< release-note date="2015-08-10" title="GeoIP ISP update" >}} We are updating the GeoIP ISP and Organization databases today to return AT&T Internet Services instead of BellSouth.net, due to a merger with AT&T. We are renaming Bouygues Telecom Division Mobile to Bouygues Mobile. There is also a bug fix to return Frontier Communications instead of AT&T Wireless for Frontier customers in Connecticut. - +{{}} - +{{< release-note date="2015-07-13" title="is_anonymous_proxy and is_satellite_provider Deprecation in GeoIP2" >}} `is_anonymous_proxy` and `is_satellite_provider` are now deprecated in GeoIP2. Use the @@ -36,9 +36,9 @@ Due to the increased coverage by mobile carriers, very few satellite providers now serve multiple countries. As a result, the `is_satellite_provider` output does not provide sufficiently relevant data for us to maintain it. - +{{}} - +{{< release-note date="2015-06-29" title="Average Income and Population Density" >}} GeoIP2 Insights web service now offers `average_income` and `population_density` fields within the `location` response. `average_income` represents the weighted average income in US dollars per person for the zip @@ -47,20 +47,20 @@ weighted population per square kilometer for the zip code(s) associated with the IP address. Note that these fields are returned for IP addresses located in the US only. These new fields are documented in the [GeoIP2 web services API documentation.](/geoip/docs/web-services) - +{{}} - +{{< release-note date="2015-06-11" title="GeoIP2 CSVs for Anonymous IP, ISP, Domain and Connection Type" >}} We've released the GeoIP2 Anonymous IP, ISP, Domain and Connection Type databases in CSV format. All GeoIP2 databases are now available in this format. - +{{}} - +{{< release-note date="2015-05-11" title="Improvements to GeoIP2 City Plus and Insights" >}} We've enhanced the GeoIP2 City Plus and GeoIP2 Insights web services to identify the organization associated with a business IP address in 10% more instances. - +{{}} - +{{< release-note date="2015-01-27" title="GeoIP Accuracy in Crimea" >}} We are working on improving the accuracy in Crimea. Approximately 60% of website visitors who are from Crimea are currently located @@ -82,4 +82,4 @@ Due to the nature of geolocation technology and other factors beyond our control, we cannot guarantee any specific future accuracy level. Further, accuracy figures are subject to change as IP networks are reallocated. - +{{}} diff --git a/content/geoip/release-notes/2016.mdx b/content/geoip/release-notes/2016.md similarity index 85% rename from content/geoip/release-notes/2016.mdx rename to content/geoip/release-notes/2016.md index 207205b64..3f723a436 100644 --- a/content/geoip/release-notes/2016.mdx +++ b/content/geoip/release-notes/2016.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2016 Archive --- - +{{< release-note date="2016-11-08" title="Change to Comcast Business ISP name" >}} We've updated any GeoIP database or service providing ISP and Organization data to return Comcast Business rather than Comcast Business Communications. We are doing so in order to use the trade name of the ISP and also because it is @@ -21,16 +21,16 @@ The following GeoIP databases and services are affected by this change: - GeoIP2 City Plus and Legacy City Web Service - GeoIP2 and Legacy Insights Web Service - +{{}} - +{{< release-note date="2016-09-15" title="Improved GeoIP accuracy outside the US" >}} The GeoIP City databases now provide significantly improved accuracy for countries outside the US, especially China, India, and Japan. See more information about GeoIP accuracy on [https://www.maxmind.com/en/geoip2-city-database-accuracy](https://www.maxmind.com/en/geoip2-city-database-accuracy) - +{{}} - +{{< release-note date="2016-04-26" title="Accuracy radius to be added to GeoLite2 City, GeoIP2 City, and GeoIP2 City Plus" >}} MaxMind will be adding accuracy radius to the GeoLite2 City and GeoIP2 City databases as well as the GeoIP2 City Plus web service. @@ -62,9 +62,9 @@ Target availability dates: - GeoIP2 City – May 17, 2016 - GeoIP2 City Plus – May 19, 2016 - +{{}} - +{{< release-note date="2016-04-11" title="Change in default lat/lon" >}} We are changing the latitude and longitude for two locations in our GeoIP and GeoLite databases. For IPs in the United States that we are unable to locate to a particular state or city, we will return 37.751, -97.822. For IPs that @@ -72,11 +72,11 @@ resolve to Ashburn, Virginia with zip code 20147, we will return 39.018, -77.539. We would like to remind customers that latitude and longitude values contained in the GeoIP databases are not precise and should not be used to identify a particular address or household. - +{{}} - +{{< release-note date="2016-02-26" title="Capitalization change for Verizon FiOS" >}} We are updating the GeoIP ISP and Organization databases to return `Verizon Fios` instead of `Verizon FiOS`, due to a change in how Verizon capitalizes Fios. If you reference `Verizon FiOS` in code or a custom rule, note that you may need to revise these references to `Verizon Fios`. - +{{}} diff --git a/content/geoip/release-notes/2017.mdx b/content/geoip/release-notes/2017.md similarity index 79% rename from content/geoip/release-notes/2017.mdx rename to content/geoip/release-notes/2017.md index 7fae5beb1..b8afcaf22 100644 --- a/content/geoip/release-notes/2017.mdx +++ b/content/geoip/release-notes/2017.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2017 Archive --- - +{{< release-note date="2017-11-02" title="Anonymizer types added to GeoIP2 Insights" >}} GeoIP2 Insights now includes anonymizer-type outputs. These outputs are: @@ -19,9 +19,9 @@ are: Please see our [GeoIP2 Web Services documentation](/geoip/docs/web-services) for more information. - +{{}} - +{{< release-note date="2017-10-31" title="The legacy GeoIP JavaScript services have been discontinued" >}} We have discontinued the legacy GeoIP JavaScript services, which used the endpoints http://js.maxmind.com/js/country.js and http://js.maxmind.com/js/geoip.js. If you still have not upgraded your @@ -30,9 +30,9 @@ API](/geoip/geolocate-an-ip/client-side-javascript) or are encountering problems with your legacy GeoIP JavaScript services, you can find more information about what to do by clicking [here](/geoip/legacy/migrating-away-from-our-legacy-geoip-javascript-services/). - +{{}} - +{{< release-note date="2017-10-10" title="Our Singapore server is live" >}} Our Singapore server is now live. GeoIP2 and GeoIP web service customers – if you hardcode any of our IPs in your application or your firewall, please make sure you have added the new server IP addresses to your @@ -42,9 +42,9 @@ list: - IPv6 address: 2607:f0d0:3:2d::4 - hostname: geoip-as-southeast.maxmind.com - +{{}} - +{{< release-note date="2017-09-27" title="Crimea accuracy update" >}} We completed our most recent review and update of Geolocation for Crimea. Our accuracy has increased as follows: @@ -64,58 +64,58 @@ Due to the nature of geolocation technology and other factors beyond our control, we cannot guarantee any specific future accuracy level. Further, accuracy figures are subject to change as IP networks are reallocated. - +{{}} - +{{< release-note date="2017-08-17" title="EOL legacy GeoIP JavaScript" >}} On October 31, 2017, we will discontinue our legacy GeoIP JavaScript services, which use the endpoints http://js.maxmind.com/js/country.js and http://js.maxmind.com/js/geoip.js. Please upgrade your legacy GeoIP integration to use our [GeoIP2 JavaScript Client API](/geoip/geolocate-an-ip/client-side-javascript) before that date. - +{{}} - +{{< release-note date="2017-07-24" title="Mapping more mobile networks to regional level" >}} We will be mapping additional mobile (cellular) networks to a region (subdivision) rather than city level. This change will only occur where the confidence in the city data is low due to the mobile provider allocating IPs over a wide area. - +{{}} - +{{< release-note date="2017-07-10" title="Removing additional anycast locations" >}} The geographical location for anycast CloudFlare networks: `104.16.0.0/12`, `162.159.0.0/16`, `190.93.244.0/22`, `198.41.192.0/19` have been removed. - +{{}} - +{{< release-note date="2017-06-23" title="Adding Multiple License Keys Support" >}} Our Account Portal has been updated to include the ability for our customers to create and manage multiple license keys. - +{{}} - +{{< release-note date="2017-06-11" title="Removing anycast locations" >}} We are removing the geographical location for the anycast CloudFlare network `141.101.112.0/20`. Anycast networks can be routed to a number of different locations all around the world, typically based on what is the nearest location. Over the next few weeks, we may remove the geographical location for additional anycast networks, including more CloudFlare networks as well as Google public DNS servers `8.8.8.8` and `8.8.4.4`. - +{{}} - +{{< release-note date="2017-05-09" title="New GeoLite2 ASN Database" >}} Our [GeoLite2 ASN database](/geoip/docs/databases) is now provided in a CSV format suitable for importing into a SQL database as well as a GeoLite2 ASN database in our MaxMind DB binary format. You can [download the database here](/geoip/geoip2/geolite2/). GeoLite2 databases may also be downloaded and updated with our [GeoIP Update program](/geoip/geoipupdate/). - +{{}} - +{{< release-note date="2017-05-08" title="Spectrum rebranding" >}} We've updated the ISP and Organization data to replace the _Charter Communications_ and _Bright House Networks_ data points with the data point _Spectrum_, as these two ISPs have merged and been rebranded as _Spectrum_. - +{{}} - +{{< release-note date="2017-03-05" title="GeoIP ISP Accuracy Improvements in Europe and Latin America" >}} The GeoIP databases and services providing ISP and Organization data have been updated. The change is to a number of European and Latin Americans ISPs. We've updated the ISP name to use the common trade name instead of the legal name. @@ -132,4 +132,4 @@ The ISP name changes include the following: - `Telefonica Movil De Chile S.A.` to `Movistar Movil Chile` - `Tele Danmark` to `TDC Danmark` - +{{}} diff --git a/content/geoip/release-notes/2018.mdx b/content/geoip/release-notes/2018.md similarity index 81% rename from content/geoip/release-notes/2018.mdx rename to content/geoip/release-notes/2018.md index 395f875aa..e73bcdef8 100644 --- a/content/geoip/release-notes/2018.mdx +++ b/content/geoip/release-notes/2018.md @@ -3,15 +3,15 @@ draft: false title: GeoIP2 Release Notes - 2018 Archive --- - +{{< release-note date="2018-11-19" title="Initial release of GeoIP2-node" >}} We have added Node.js as a MaxMind Supported GeoIP2 API ([NPM](https://www.npmjs.com/package/@maxmind/geoip2-node), [GitHub](https://github.com/maxmind/GeoIP2-node)). It provides an API for the GeoIP2 databases, and will provide an API for the GeoIP2 web services. This API also works with MaxMind's free GeoLite2 databases. - +{{}} - +{{< release-note date="2018-09-21" title="Changes to US coordinate data" >}} On Monday, October 1st, we will be changing a large amount of our U.S. coordinate (latitude & longitude) data\* to use [GeoNames](https://www.geonames.org/) coordinates for postal codes. This change @@ -23,9 +23,9 @@ _\* Coordinate data is approximate and is not precise. It should not be used to identify a particular street address or household as it refers to a larger geographical area instead of a precise location._ - +{{}} - +{{< release-note date="2018-08-14" title="Mapping IPs to districts of Seoul" >}} Effective August 21st, we will be mapping IP addresses to [Districts (Gu) of Seoul](https://en.wikipedia.org/wiki/List_of_districts_of_Seoul) instead of Seoul. This will allow customers to have a more precise mapping, similar to how @@ -34,31 +34,31 @@ will continue to map some IPs to Seoul if we are unable to determine the specific district the IP is located in. We will also continue to map IPs located in the central Jung District to Seoul, similar to how we map IPs in Manhattan to New York and IPs in Chūō to Tokyo. - +{{}} - +{{< release-note date="2018-07-17" title="Mapping more IPs to special wards of Tokyo" >}} Effective July 24th, we will be mapping more IP addresses to [special wards of Tokyo](https://en.wikipedia.org/wiki/Special_wards_of_Tokyo) instead of Tokyo itself. This will allow customers to have a more precise mapping, similar to how we map IPs to New York City and London boroughs. We will continue to map some IPs to Tokyo if we are unable to determine the specific special ward the IP is located in. - +{{}} - +{{< release-note date="2018-07-03" title="Renaming Time Warner Cable to Spectrum" >}} Effective July 10th, we will update the ISP and Organization data to replace the Time Warner Cable name with the name Spectrum, as these two ISPs have merged and Time Warner Cable has been rebranded as Spectrum. - +{{}} - + {{< release-note date="2018-05-25" title="New European Union locations added to GeoIP2 databases and services" >}} Effective May 29, 2018, we will be adding Åland Islands, Martinique, Mayotte, Guadeloupe, French Guiana, Réunion, and Saint Martin to the list of European Union locations identified by the GeoIP2 Country, GeoIP2 City, and GeoIP2 Enterprise databases and GeoIP2 web services responses. - +{{}} - + {{< release-note date="2018-04-18" title="Discontinuation of the GeoLite Legacy databases" >}} We have decided to discontinue the GeoLite Legacy databases on January 2, 2019. As part of that process, updated versions of the GeoLite Legacy databases are now only available to [redistribution license @@ -72,9 +72,9 @@ update their integrations by January 2, 2019. Correspondingly, we have decided against removing latitude and longitude coordinates from the GeoLite2 databases. We are in the process of reviewing coordinates used in all of our GeoLite2 and GeoIP databases to ensure there is no risk of misuse. - +{{}} - + {{< release-note date="2018-02-13" title="EU Country outputs added to to GeoIP2 Country, City, Enterprise DBs and web service" >}} We have added additional outputs to the GeoIP2 Country, GeoIP2 City, and GeoIP2 Enterprise databases and to the GeoIP2 web services. The outputs are: @@ -87,4 +87,4 @@ _GeoIP2 Country, GeoIP2 City, and GeoIP2 Enterprise CSV databases will have a new column added to the location files named “is_in_european_union”. This will be “1” if the country is in the European Union and “0” otherwise._ - +{{}} diff --git a/content/geoip/release-notes/2019.mdx b/content/geoip/release-notes/2019.md similarity index 81% rename from content/geoip/release-notes/2019.mdx rename to content/geoip/release-notes/2019.md index 341ae8167..a6623a3b4 100644 --- a/content/geoip/release-notes/2019.mdx +++ b/content/geoip/release-notes/2019.md @@ -3,56 +3,56 @@ draft: false title: GeoIP2 Release Notes - 2019 Archive --- - +{{< release-note date="2019-12-23" title="The USER_ID_REQUIRED error code is now ACCOUNT_ID_REQUIRED" >}} Our web services, including [GeoIP2 web services](https://www.maxmind.com/en/geoip2-precision-insights) and [minFraud services](https://www.maxmind.com/en/solutions/minfraud-services), now return the error code `ACCOUNT_ID_REQUIRED` instead of `USER_ID_REQUIRED` when the account ID parameter is missing. - +{{}} - +{{< release-note date="2019-12-19" title="Resolving to parent city for Australian suburbs" >}} Effective December 23, 2019, we will begin resolving more Australian IP addresses to large cities instead of suburbs (e.g. to Sydney instead of Rushcutters Bay). - +{{}} - +{{< release-note date="2019-12-18" title="Changes to accessing and using GeoLite2 databases" >}} **Free GeoLite2 Database Users:** Due to upcoming data privacy regulations, we are making significant changes to how you access free GeoLite2 databases starting December 30, 2019. Learn more on our [blog](https://blog.maxmind.com/2019/12/significant-changes-to-accessing-and-using-geolite2-databases/). - +{{}} - +{{< release-note date="2019-12-17" title="Query usage report license key filter" >}} You can now filter by license key when viewing the [query usage report](https://www.maxmind.com/en/accounts/current/query-usage-report) \[login required\] in your account portal. - +{{}} - +{{< release-note date="2019-12-10" title="Changes to Japan Postal Codes" >}} Effective December 16, 2019, we will return `1` as the last digit for all 7 digit postal codes in Japan. The last digit refers to [street-level resolution](https://en.wikipedia.org/wiki/Postal_codes_in_Japan) and should not be relied upon for IP geolocation. - +{{}} - +{{< release-note date="2019-11-08" title="Changes to Portugal Postal Codes" >}} Effective November 12, 2019, we will return `-001` as the last 3 digits for all 7 digit postal codes in Lisbon, Portugal. Our postal code resolution in Portugal is accurate for the first 4 digits and we include the `-001` at the end for backwards compatibility for customers to join the data with 7 digit Portuguese postal code databases. We may extend this convention to other large Portuguese cities in the future. - +{{}} - +{{< release-note date="2019-10-16" title="Retirement of TLS 1.0/1.1 and unencrypted http minFraud requests" >}} We retired support for TLS v1.0/v1.1 and unencrypted HTTP requests to minFraud services today, as part of our commitment to securing and protecting your data. Please ensure you are using TLS v1.2+ to connect to MaxMind services. - +{{}} - +{{< release-note date="2019-10-15" title="New static_ip_score output in web services" >}} The following output has been added to the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights), and [minFraud Insights and Factors web @@ -67,9 +67,9 @@ services](https://www.maxmind.com/en/solutions/minfraud-services): The `static_ip_score` output is present in the `traits` object. - +{{}} - +{{< release-note date="2019-10-14" title="Final reminder of security-related retirements" >}} This is a reminder that we are retiring support for requests using TLS 1.0/1.1, and unencrypted HTTP requests to MaxMind minFraud services on **October 16, 2019**. After October 16, 2019, these types of requests will always fail with @@ -80,9 +80,9 @@ so. [Contact us](https://support.maxmind.com/hc/en-us/requests/new) for support or if you have questions. - +{{}} - +{{< release-note date="2019-10-03" title="Improved cellular IP detection" >}} We have made improvements to how we identify cellular IPs for the `connection_type` field provided in the [GeoIP2 Connection Type database](https://www.maxmind.com/en/geoip2-connection-type-database), and the @@ -90,9 +90,9 @@ database](https://www.maxmind.com/en/geoip2-connection-type-database), and the service](https://www.maxmind.com/en/geoip2-precision-insights) and [minFraud services](https://www.maxmind.com/en/solutions/minfraud-services). Accuracy for cellular identification should now be about 95% accurate globally. - +{{}} - +{{< release-note date="2019-10-02" title="Account activity log" >}} You can now view a log of your MaxMind account activity, which includes a time stamp, requester, and subject, for the each of the following actions: @@ -107,9 +107,9 @@ activity log in your account portal under 'Account Information' or [here](https://www.maxmind.com/en/accounts/current/activity-log) \[login required\]. - +{{}} - +{{< release-note date="2019-09-19" title="New network and user_count outputs in web services" >}} The following outputs have been added to the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights), and [minFraud Insights and Factors web @@ -125,9 +125,9 @@ services](https://www.maxmind.com/en/solutions/minfraud-services): Both of these outputs are present in the `traits` object. - +{{}} - +{{< release-note date="2019-09-16" title="Planned warning interruption (September 2019)" >}} **8-hour interruption of old TLS and unencrypted minFraud requests on September 25, 2019** @@ -147,9 +147,9 @@ you have any questions, please do not hesitate to is available on our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/). - +{{}} - +{{< release-note date="2019-08-26" title="Anonymous IP data in GeoIP online lookup form" >}} GeoIP2 web service customers can now access [anonymous IP data](https://www.maxmind.com/en/solutions/geoip2-enterprise-product-suite/anonymous-ip-database) through the [GeoIP2 online lookup @@ -157,18 +157,18 @@ form](https://www.maxmind.com/en/accounts/current/geoip/lookup) \[login required\] in the account portal. Select the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights) on the form when querying IP(s). - +{{}} - +{{< release-note date="2019-08-21" title="Improved business IP detection" >}} We have made improvements in how we detect business IPs for the user type field provided as part of the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights) and [minFraud services](https://www.maxmind.com/en/solutions/minfraud-services). Approximately 1% of residential IPs were recently corrected to the appropriate business user type as a result of these improvements. - +{{}} - +{{< release-note date="2019-08-20" title="Planned warning interruption (August 2019)" >}} **8-hour interruption of old TLS and unencrypted minFraud requests on August 28, 2019** @@ -188,16 +188,16 @@ you have any questions, please do not hesitate to is available on our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/). - +{{}} - +{{< release-note date="2019-08-13" title="Weekly updates for GeoIP2 ISP and GeoIP2 Connection Type" >}} We now update the GeoIP2 ISP and GeoIP2 Connection Type databases weekly (previously they were updated twice a month and once a month respectively). Update your download frequency if you use these databases to ensure you have the most up-to-date files. - +{{}} - +{{< release-note date="2019-07-24" title="Planned warning interruption" >}} There will be a planned service interruption for all requests to MaxMind services that use TLS versions 1.0 and 1.1, and for unencrypted HTTP requests to MaxMind legacy minFraud services (e.g. minFraud Standard, minFraud Premium, @@ -218,16 +218,16 @@ you have any questions, please do not hesitate to is available on our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/). - +{{}} - +{{< release-note date="2019-07-15" title="Postal code data for Singapore and South Korea" >}} We are adding postal code data for Singapore and South Korea. Effective July 22nd 2019, we will return the first 2 digits of Singapore postal codes and 5-digit South Korea postal codes where we have reasonable confidence in postal resolution. - +{{}} - +{{< release-note date="2019-07-02" title="Security Tokens" >}} We've updated the direct download URLs for GeoIP databases in your account portal to use security tokens instead of license keys. If you are a new user and wish to use your own script or program to automate GeoIP downloads instead @@ -241,27 +241,27 @@ to automate GeoIP downloads, this change should not affect you, unless you add new databases to your script or program. Instructions on additional steps are [here](/geoip/updating-databases). - +{{}} - +{{< release-note date="2019-04-18" title="Security-related retirements 2019" >}} In order to ensure your data is as safe and secure as possible, we will be retiring support for TLS v1.0 and 1.1, unencrypted HTTP requests to our legacy minFraud services, and our legacy minFraud SOAP API in the coming months. Please see our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/) for more info. - +{{}} - +{{< release-note date="2019-04-08" title="2FA release" >}} To enhance the security of your MaxMind account, Chrome users can enable two-factor authentication (2FA). You can now add and require a (FIDO U2F) security key on top of your account credentials for a more secure log-in. See our [support center user guide](https://support.maxmind.com/hc/en-us/articles/1260803946470-Set-Up-Two-Factor-Authentication) for information on how to set up 2FA. - +{{}} - +{{< release-note date="2019-01-24" title="Crimea accuracy update 2019" >}} We completed our most recent review and update of Geolocation for Crimea. Our accuracy has increased as follows: Approximately 93% of website visitors who are from Crimea are currently located @@ -280,34 +280,34 @@ Due to the nature of geolocation technology and other factors beyond our control, we cannot guarantee any specific future accuracy level. Further, accuracy figures are subject to change as IP networks are reallocated. - +{{}} - +{{< release-note date="2019-01-23" title="Initial Release of Ruby API" >}} We have added Ruby as a MaxMind Supported GeoIP2 API ([RubyGems](https://rubygems.org/gems/maxmind-db), [GitHub](https://github.com/maxmind/MaxMind-DB-Reader-ruby)). It provides a Ruby reader for the MaxMind DB Database Format (used by the GeoIP2 databases and our free GeoLite2 databases). - +{{}} - +{{< release-note date="2019-01-14" title="New GeoIP Update released" >}} We've released a new major version of GeoIP Update. This release adds support for Windows and has a new code base. You can find it on [GitHub](https://github.com/maxmind/geoipupdate). We’ve written an [upgrade guide](/geoip/geoipupdate/upgrading-to-geoip-update-4-x/) if you’re running an older version. - +{{}} - +{{< release-note date="2019-01-14" title="Limiting availability of archived GeoIP databases" >}} In order to address new legal requirements, including the European Union's General Data Protection Regulation (GDPR), we will be limiting availability of archived GeoIP databases to 30 days. This change will be effective March 18, 2019 and applies to all GeoIP2, GeoIP, and GeoLite2 databases. You may need to change your processes or applications to download more recent databases once this change occurs. - +{{}} - +{{< release-note date="2019-01-04" title="Server IP Changes January 2019" >}} On Monday, January 7, 2019 at approximately 15:00 UTC (10:00am EST), we will be switching to static server IP addresses for traffic to our website and to downloads.maxmind.com (used for GeoIP database downloads). The IP for the @@ -318,10 +318,10 @@ what we list on our [MaxMind server IP addresses page](/maxmind-server-ip-addresses/). We will update the list of IP addresses on that page following the change. Please sign up for the email list on that page if you want a notification when our server IP addresses change. - +{{}} - +{{< release-note date="2019-01-02" title="GeoIP2-node includes support for web service lookups" >}} We have added web service lookup support to our GeoIP2 Node.js API ([NPM](https://www.npmjs.com/package/@maxmind/geoip2-node), [GitHub](https://github.com/maxmind/GeoIP2-node)). - +{{}} diff --git a/content/geoip/release-notes/2020.mdx b/content/geoip/release-notes/2020.md similarity index 82% rename from content/geoip/release-notes/2020.mdx rename to content/geoip/release-notes/2020.md index cb49bfe4c..e3e772b8a 100644 --- a/content/geoip/release-notes/2020.mdx +++ b/content/geoip/release-notes/2020.md @@ -3,23 +3,23 @@ draft: false title: GeoIP2 Release Notes - 2020 Archive --- - +{{< release-note date="2020-12-30" title="United Kingdom will no longer be flagged is_in_european_union" >}} Effective January 5, 2021, the `is_in_european_union` flag will no longer be marked true for locations in the United Kingdom. This change will be reflected in the data in GeoLite2 databases and web services, GeoIP2 databases, GeoIP2 web services, and minFraud Insights and Factors services. - +{{}} - +{{< release-note date="2020-12-15" title="GeoLite2 web service released" >}} We have released a free IP geolocation API, which allows users to query our GeoLite2 data. See our blog for [an overview of the GeoLite2 web service](https://blog.maxmind.com/2020/12/geolite2-web-service-free-ip-geolocation-api/). You can learn how to integrate the GeoLite2 web service in our [Getting Started with GeoLite2 guide](https://support.maxmind.com/hc/en-us/articles/4408248793627-Test-the-Web-Services). - +{{}} - +{{< release-note date="2020-12-14" title="Notifications for database update delays" >}} We now provide direct notifications in the rare event of a database update delay (past 11:59 PM EST on Tuesdays) on our [service status page](https://status.maxmind.com/). You can subscribe to these updates by @@ -28,9 +28,9 @@ the page. After subscribing to updates, select 'Manage Existing Subscription' to manage which services you receive updates for. You can deselect services and servers which are not relevant to you, though you should ensure ‘New Database Update Releases’ is selected. - +{{}} - +{{< release-note date="2020-12-10" title="GeoNames Monthly Diff Report December 2020" >}} [GeoNames Monthly Diff Report (December 2020)](/static/csv/GeoNames-Monthly-Diff-Report-December-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -56,9 +56,9 @@ differ for the field defined in the ‘diff_in’ column. `Republic of Lithuania` to `Lithuania`). These changes will show up in this month's GeoIP2 builds. - +{{}} - +{{< release-note date="2020-11-10" title="GeoNames Monthly Diff Report November 2020" >}} [GeoNames Monthly Diff Report (November 2020)](/static/csv/GeoNames-Monthly-Diff-Report-November-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -80,9 +80,9 @@ November as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2020-10-20" title="New Data Point is_residential_proxy Released for GeoIP2 Anonymous IP" >}} We have released an additional data point for the [GeoIP2 Anonymous IP Database](https://www.maxmind.com/en/solutions/geoip2-enterprise-product-suite/anonymous-ip-database). Subscribers can now identify whether an IP address is likely a [residential @@ -101,9 +101,9 @@ files: [MMDB reader](/geoip/geolocate-an-ip/databases/#official-maxmind-client-apis) to support look-ups containing the new output when it is released. - +{{}} - +{{< release-note date="2020-10-20" title="New Output is_residential_proxy Released for GeoIP2 Insights Web Service, minFraud Insights, and minFraud Factors" >}} We have released an additional output for our web services. [GeoIP2 Insights](https://www.maxmind.com/en/geoip2-precision-services), [minFraud Insights, and minFraud @@ -120,18 +120,18 @@ Our have been updated to support these outputs so may need to refresh yours if you are not interfacing directly with our REST API. - +{{}} - +{{< release-note date="2020-10-19" title="Residential proxy flag deployment" >}} The release of the new `is_residential_proxy` output for the [GeoIP2 Anonymous IP database](https://www.maxmind.com/en/solutions/geoip2-enterprise-product-suite/anonymous-ip-database), which was originally scheduled for today (October 19, 2020), will instead happen tomorrow (October 20, 2020). We expect the database update will go out around 12:30pm UTC. - +{{}} - +{{< release-note date="2020-10-12" title="GeoNames Monthly Diff Report October 2020" >}} [GeoNames Monthly Diff Report (October 2020)](/static/csv/GeoNames-Monthly-Diff-Report-October-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -153,26 +153,26 @@ October as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2020-09-17" title="Flagging more networks as 'corporate'" >}} Effective September 21, 2020 we will be flagging significantly more IP networks used by data centers and businesses as `Corporate` in the [GeoIP2 Connection Type database](https://www.maxmind.com/en/geoip2-connection-type-database). We expect the size of the MMDB file to increase by about 20% and the size of the CSV file to increase by about 210%. - +{{}} - +{{< release-note date="2020-09-10" title="Billing and Product/Service Permission Types for Standard Users" >}} We have added a new permission category for the Standard User type. The Product/Service permission grants a Standard User access to product and service related functionality in the account portal without having access to user management and billing functionality. For more information, consult our [Multi-User Account Access Guide](https://support.maxmind.com/hc/en-us/articles/4407107969947-Manage-Multiple-Users). - +{{}} - +{{< release-note date="2020-09-10" title="GeoNames Monthly Diff Report September 2020" >}} [GeoNames Monthly Diff Report (September 2020)](/static/csv/GeoNames-Monthly-Diff-Report-September-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -194,9 +194,9 @@ September as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2020-09-01" title="Decommissioned GeoIP2 JavaScript API Domain" >}} In order to provide the best cross-browser support, we have migrated the GeoIP2 JavaScript Client API from geoip-js.maxmind.com to geoip-js.com. The geoip-js.maxmind.com URL will be decommissioned at 5:00pm EDT today. If you @@ -205,16 +205,16 @@ version of the GeoIP2 JavaScript Client API to the [version currently available on our website](/geoip/geolocate-an-ip/client-side-javascript). If you have your own forked version, update the domain name used for the service request from **geoip-js.maxmind.com** to **geoip-js.com**. - +{{}} - +{{< release-note date="2020-08-13" title="Incorrect Spanish IP mappings to El Salvador" >}} GeoIP databases released the week of August 11, 2020 contain an issue where approximately 1% of Spanish IPs incorrectly map to El Salvador. We are working on a fix and plan to release corrected GeoIP databases tomorrow (August 14, 2020). - +{{}} - +{{< release-note date="2020-08-10" title="GeoNames Monthly Diff Report August 2020" >}} [GeoNames Monthly Diff Report (August 2020)](/static/csv/GeoNames-Monthly-Diff-Report-August-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -242,9 +242,9 @@ the same. For more info see [this thread](https://groups.google.com/g/geonames/c/_xNFdHAy07o/m/cW8VWFjGAAAJ). These changes will show up in this month's GeoIP2 builds. - +{{}} - +{{< release-note date="2020-07-09" title="GeoNames Monthly Diff Report July 2020" >}} [GeoNames Monthly Diff Report (July 2020)](/static/csv/GeoNames-Monthly-Diff-Report-July-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -266,17 +266,17 @@ of July as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2020-06-22" title="FIDO2 Support for Two-Factor Authentication" >}} We've updated our Two-Factor Authentication (2FA) implementation to the [FIDO2 standard](https://fidoalliance.org/fido2/), which supports more web browsers and more types of security keys (e.g. supported biometrics keys). See our [Two-Factor Authentication (2FA) User Guide for more information](https://support.maxmind.com/hc/en-us/articles/1260803946470-Set-Up-Two-Factor-Authentication). - +{{}} - +{{< release-note date="2020-06-12" title="GeoNames Monthly Diff Report June 2020" >}} [GeoNames Monthly Diff Report (June 2020)](/static/csv/GeoNames-Monthly-Diff-Report-June-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -298,9 +298,9 @@ of June as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2020-05-11" title="GeoNames Monthly Diff Report May 2020" >}} [GeoNames Monthly Diff Report (May 2020)](/static/csv/GeoNames-Monthly-Diff-Report-May-2020.csv) GeoIP2 and GeoLite2 databases incorporate @@ -322,9 +322,9 @@ of May as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2020-05-05" title="Resolving to borough of Queens for Queens, NY, neighborhoods" >}} Effective May 11, 2020, we will begin resolving IPs that currently return the neighborhood of Astoria (Queens, NY) to the corresponding borough of Queens in the city name field. We will then resolve the remaining Queens neighborhoods to @@ -333,29 +333,29 @@ Queens starting May 18, 2020. For more granular place identification (such as neighborhood), we recommend using the postal code where provided. - +{{}} - +{{< release-note date="2020-05-01" title="GeoIP Legacy Downloadable Database Retirement" >}} We are retiring our GeoIP Legacy database formats at the end of May 2022. Please see our [blog post](https://blog.maxmind.com/2020/06/retirement-of-geoip-legacy-downloadable-databases-in-may-2022/) for more information, including how to migrate to GeoIP2. - +{{}} - +{{< release-note date="2020-04-27" title="Broadband filter for GeoIP accuracy statistics" >}} We updated our [GeoIP2 accuracy statistics page](https://www.maxmind.com/en/geoip2-city-accuracy-comparison) to allow filtering by broadband IPs. This builds on top of existing filters that allow you to filter by IPv6 or cellular IPs. - +{{}} - +{{< release-note date="2020-04-17" title="Docker image for GeoIP update program" >}} We published a Docker image for the [GeoIP Update program](/geoip/updating-databases) here: [https://hub.docker.com/r/maxmindinc/geoipupdate](https://hub.docker.com/r/maxmindinc/geoipupdate). - +{{}} - +{{< release-note date="2020-04-15" title="GeoNames Monthly Diff Report April 2020" >}} GeoIP2 and GeoLite2 databases incorporate [GeoNames geographical data](https://www.geonames.org/), which is made available under the [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/). @@ -380,24 +380,24 @@ differ for the field defined in the ‘diff_in’ column. [recent ISO updates](https://www.iso.org/obp/ui/#iso:code:3166:ZA). These changes will show up in this month's GeoIP2 builds. - +{{}} - +{{< release-note date="2020-02-27" title="GeoIP2 Ruby API supports web service lookups" >}} We have added support for web service lookups to the MaxMind Supported Ruby API ([RubyGems](https://rubygems.org/gems/maxmind-geoip2), [GitHub](https://github.com/maxmind/GeoIP2-ruby)). - +{{}} - +{{< release-note date="2020-02-18" title="mmdbinspect beta release" >}} We've released [mmdbinspect](https://github.com/maxmind/mmdbinspect), in beta, which gives GeoIP2 users an easier way to interface with multiple [MMDB](https://maxmind.github.io/MaxMind-DB/) files. The [mmdbinspect tool](https://github.com/maxmind/mmdbinspect) is a command-line interface built with Go, which allows a user to look up one or more IPs from one or more MMDB databases and receive the output in a parsable JSON format. - +{{}} - +{{< release-note date="2020-02-14" title="Privacy Exclusions API" >}} We've released a [Privacy Exclusions API](/geoip/privacy-exclusions-api/). This API allows you to retrieve a list of IP addresses associated with valid @@ -405,21 +405,21 @@ This API allows you to retrieve a list of IP addresses associated with valid Consumer Privacy Act (CCPA). You may view this list, along with more information, in your [account portal](https://www.maxmind.com/en/accounts/current/do-not-sell-requests). - +{{}} - +{{< release-note date="2020-01-21" title="Changes to ASN Organization Data" >}} Effective January 21, 2020, many records for the `autonomous_system_organization` data field in GeoIP2 databases and web services will change from full ISP names to abbreviated codes, due to changes in a third-party data feed that contributes to building this data. We recommend using the `isp` and `organization` data fields as they should be more stable over time and reflect the full ISP brand name. - +{{}} - +{{< release-note date="2020-01-06" title="Flagging more networks used by businesses as 'corporate'" >}} Effective January 20, 2020, we will be flagging more Cable/DSL networks used by businesses (i.e. IP networks from ISPs that serve mid-small sized businesses) as `Corporate` in the [GeoIP2 Connection Type database](https://www.maxmind.com/en/geoip2-connection-type-database). Previously these types of networks were more often flagged as `Cable/DSL`. - +{{}} diff --git a/content/geoip/release-notes/2021.mdx b/content/geoip/release-notes/2021.md similarity index 87% rename from content/geoip/release-notes/2021.mdx rename to content/geoip/release-notes/2021.md index 24d5d9980..cff18cc14 100644 --- a/content/geoip/release-notes/2021.mdx +++ b/content/geoip/release-notes/2021.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2021 Archive --- - +{{< release-note date="2021-12-20" title="GeoNames Monthly Diff Report December 2021" >}} [GeoNames Monthly Diff Report (December 2021)](/csv-files/GeoNames-Monthly-Diff-Report-December-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -25,9 +25,9 @@ December as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-12-15" title="December Holiday Database Release Schedule" >}} Due to the December holidays, we will not be providing database updates for certain databases next Friday, December 24 and Friday, December 31. The following GeoIP2 databases will not have their regularly scheduled updates: @@ -41,9 +41,9 @@ The GeoIP2 Anonymous IP database will continue to update as scheduled. We will resume our regular update schedule beginning on Tuesday, January 4. - +{{}} - +{{< release-note date="2021-11-23" title="No Friday Updates for GeoIP2 Databases" >}} Due to the Thanksgiving holiday, we will not be providing database updates for certain databases this Friday, November 26. The following GeoIP2 databases will not have their regularly scheduled update: @@ -57,9 +57,9 @@ The GeoIP2 Anonymous IP database will continue to update as scheduled. We will resume our regular update schedule beginning on Tuesday, November 30. - +{{}} - +{{< release-note date="2021-11-12" title="GeoNames Monthly Diff Report November 2021" >}} [GeoNames Monthly Diff Report (November 2021)](/csv-files/GeoNames-Monthly-Diff-Report-November-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -81,9 +81,9 @@ November as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-10-13" title="Crimea geolocation accuracy update" >}} We completed our most recent review and update of geolocation for Crimea. Our accuracy has increased as follows: @@ -96,9 +96,9 @@ Due to the nature of geolocation technology and other factors beyond our control, we cannot guarantee any specific future accuracy level. Further, accuracy figures are subject to change as IP networks are reallocated. - +{{}} - +{{< release-note date="2021-10-10" title="GeoNames Monthly Diff Report October 2021" >}} [GeoNames Monthly Diff Report (October 2021)](/csv-files/GeoNames-Monthly-Diff-Report-October-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -120,9 +120,9 @@ October as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-09-28" title="Update to geolocation databases to fix Japanese geolocations" >}} We are releasing an update for our GeoIP2 Country, City, and Enterprise databases, and for our GeoIP2 Country, City Plus, and Insights web services to fix a bug that geolocated about 0.1% of IP addresses located in Japan to the @@ -135,9 +135,9 @@ or using [your GeoIP Update program](/geoip/updating-databases). If you use any of the GeoIP2 web services, you will have access to the updated data with no further action required. - +{{}} - +{{< release-note date="2021-09-23" title="Update to minimum accuracy_radius value" >}} Effective October 4, 2021, the minimum accuracy radius value will be 5km across our city/postal-level geolocation products and services. Previously, the minimum accuracy radius value was 1km. This change applies to the following products and @@ -153,9 +153,9 @@ services: We are making this change in order to ensure it is clear that IP geolocation should not be used to identify a particular street address or household. - +{{}} - +{{< release-note date="2021-09-10" title="GeoNames Monthly Diff Report September 2021" >}} [GeoNames Monthly Diff Report (September 2021)](/csv-files/GeoNames-Monthly-Diff-Report-September-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -177,9 +177,9 @@ September as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-09-08" title="Data Updates for Apple iCloud Private Relay" >}} We have updated our data in a number of ways in preparation for the rollout of [iCloud Private Relay](https://developer.apple.com/support/prepare-your-network-for-icloud-private-relay/). We have worked with Apple to ensure that our data accurately reflects how @@ -229,9 +229,9 @@ on Apple’s developer website. We will continue to monitor these IPs and make any adjustments that are needed in the future. - +{{}} - +{{< release-note date="2021-08-31" title="Mapping more mobile networks to a state" >}} We will be mapping more mobile (cellular) networks to a state (subdivision) rather than a city for the United States and other countries. This change will better reflect the end user location of these IP addresses across a region @@ -248,9 +248,9 @@ These changes will be implemented incrementally. Some IP addresses will reflect this change on September 2, 2021, and additional IP addresses will be updated on September 13, 2021. - +{{}} - +{{< release-note date="2021-08-18" title="Increased file size of GeoIP2 Country, City, and Enterprise databases, and GeoLite2 Country and City databases" >}} The file sizes of the GeoIP2 Country, City, and Enterprise databases, and the GeoLite2 Country and City databases will increase significantly on Friday, August 20, 2021. The file size increase is due to the activation of a large @@ -270,9 +270,9 @@ number of IPv6 network ranges. forecast. We are working to establish processes that will allow us to provide better notification about a change in database file size. - +{{}} - +{{< release-note date="2021-08-10" title="GeoNames Monthly Diff Report August 2021" >}} [GeoNames Monthly Diff Report (August 2021)](/csv-files/GeoNames-Monthly-Diff-Report-August-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -294,9 +294,9 @@ August as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-07-12" title="GeoNames Monthly Diff Report July 2021" >}} [GeoNames Monthly Diff Report (July 2021)](/csv-files/GeoNames-Monthly-Diff-Report-July-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -318,9 +318,9 @@ July as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-06-14" title="GeoNames Monthly Diff Report June 2021" >}} [GeoNames Monthly Diff Report (June 2021)](/csv-files/GeoNames-Monthly-Diff-Report-June-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -345,9 +345,9 @@ differ for the field defined in the ‘diff_in’ column. \* This month’s update includes a significant number of changes to `city_name`s in Ukraine and `geoname_id`s in Brazil. - +{{}} - +{{< release-note date="2021-06-08" title="Twice weekly updates for some GeoIP2 databases" >}} We now update GeoIP2 Country, City, ISP, and Enterprise databases (and most of their legacy equivalents) twice weekly on Tuesdays and Fridays (instead of weekly). We made this change so that data corrections and location updates can @@ -357,9 +357,9 @@ If you would like to take advantage of these more frequent updates, you will have to update the schedule of your GeoIP2 database downloads. You can find [documentation on updating your GeoIP2 databases on our developer’s site](/geoip/updating-databases). - +{{}} - +{{< release-note date="2021-05-10" title="GeoNames Monthly Diff Report May 2021" >}} [GeoNames Monthly Diff Report (May 2021)](/csv-files/GeoNames-Monthly-Diff-Report-May-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -384,9 +384,9 @@ differ for the field defined in the ‘diff_in’ column. \* This month’s update includes a significant number of changes to subdivision codes in Algeria and Lithuania. - +{{}} - +{{< release-note date="2021-04-09" title="GeoNames Monthly Diff Report April 2021" >}} [GeoNames Monthly Diff Report (April 2021)](/csv-files/GeoNames-Monthly-Diff-Report-April-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -408,9 +408,9 @@ April as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-03-09" title="GeoNames Monthly Diff Report March 2021" >}} [GeoNames Monthly Diff Report (March 2021)](/csv-files/GeoNames-Monthly-Diff-Report-March-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -435,9 +435,9 @@ differ for the field defined in the ‘diff_in’ column. \* This month’s update includes changes that should improve overall accuracy of city-level name data. - +{{}} - +{{< release-note date="2021-02-11" title="GeoNames Monthly Diff Report February 2021" >}} [GeoNames Monthly Diff Report (February 2021)](/csv-files/GeoNames-Monthly-Diff-Report-February-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -459,9 +459,9 @@ February as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2021-01-29" title="Mapping more Telstra Internet mobile networks to a state" >}} We will be mapping more mobile (cellular) networks to a state (subdivision) rather than a city for Telstra Internet IPs in Australia, as well as other mobile networks in France and other countries. This change will better reflect @@ -471,9 +471,9 @@ These changes will be implemented incrementally. Some IP addresses will reflect this change on February 2, 2021, and additional IP addresses will be updated on February 16, 2021. - +{{}} - +{{< release-note date="2021-01-22" title="Change to Vodafone Germany ISP name" >}} On Monday, January 25 we will be updating MaxMind products and services with ISP data to consolidate naming conventions for Vodafone Germany. We will now return either `Vodafone Germany Cable`, `Vodafone Germany DSL`, `Vodafone @@ -492,9 +492,9 @@ The following GeoIP databases and services are affected by this change: - minFraud Insights - minFraud Factors - +{{}} - +{{< release-note date="2021-01-11" title="GeoNames Monthly Diff Report January 2021" >}} [GeoNames Monthly Diff Report (January 2021)](/csv-files/GeoNames-Monthly-Diff-Report-January-2021.csv) GeoIP2 and GeoLite2 databases incorporate @@ -516,4 +516,4 @@ January as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} diff --git a/content/geoip/release-notes/2022.mdx b/content/geoip/release-notes/2022.md similarity index 87% rename from content/geoip/release-notes/2022.mdx rename to content/geoip/release-notes/2022.md index ab6245c10..d107cd47f 100644 --- a/content/geoip/release-notes/2022.mdx +++ b/content/geoip/release-notes/2022.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2022 Archive --- - +{{< release-note date="2022-12-19" title="December Holiday Database Release Schedule" >}} Due to the December holidays, we will not be providing database updates for certain databases this Friday, December 23. The following GeoIP2 and GeoLite2 @@ -21,9 +21,9 @@ The GeoIP2 Anonymous IP database will continue to update as scheduled. We will resume our regular update schedule beginning on Tuesday, December 27. - +{{}} - +{{< release-note date="2022-12-19" title="Twice weekly updates for the GeoIP Connection Type database" >}} We now update the GeoIP2 Connection Type databases twice weekly on Tuesdays and Fridays (instead of weekly). We made this change so that data corrections and @@ -33,9 +33,9 @@ If you would like to take advantage of these more frequent updates, you will have to update the schedule of your GeoIP2 database downloads. [You can find documentation on updating your GeoIP2 databases on our developer’s site.](/geoip/updating-databases) - +{{}} - +{{< release-note date="2022-12-12" title="GeoNames Monthly Diff Report December 2022" >}} [GeoNames Monthly Diff Report (December 2022)](/csv-files/GeoNames-Monthly-Diff-Report-December-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -57,9 +57,9 @@ December as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-11-21" title="No Friday Updates for GeoIP2 Databases" >}} Due to the Thanksgiving holiday, we will not be providing database updates for certain databases this Friday, November 25. The following GeoIP2 databases will not have their regularly scheduled update: @@ -73,9 +73,9 @@ The GeoIP2 Anonymous IP database will continue to update as scheduled. We will resume our regular update schedule beginning on Tuesday, November 29. - +{{}} - +{{< release-note date="2022-11-10" title="GeoNames Monthly Diff Report November 2022" >}} [GeoNames Monthly Diff Report (November 2022)](/csv-files/GeoNames-Monthly-Diff-Report-November-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -97,9 +97,9 @@ November as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-10-11" title="MaxMind Sandbox has Launched" >}} We've launched a new Sandbox Environment for technical validation and testing of your integration with our GeoIP and minFraud web services. The Sandbox environment is available for all paying MaxMind customers. @@ -108,9 +108,9 @@ environment is available for all paying MaxMind customers. [You can also read more about testing GeoIP web services on the Sandbox.](/geoip/docs/web-services/sandbox-environment) - +{{}} - +{{< release-note date="2022-10-11" title="GeoNames Monthly Diff Report October 2022" >}} [GeoNames Monthly Diff Report (October 2022)](/csv-files/GeoNames-Monthly-Diff-Report-October-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -132,9 +132,9 @@ October as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-09-26" title="Changes to Registered Country data" >}} We have made some changes to how we determine the registered country associated with an IP address. We estimate that this change will affect around 1% of IP addresses with a registered country value. The following databases and web @@ -160,9 +160,9 @@ IP, it will be removed. In other cases, the value may be changed. [You can learn more about the difference between registered country and the IP geolocation on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414762983195-Country-level-and-City-level-Geolocation) - +{{}} - +{{< release-note date="2022-09-14" title="Change to Time Zone Name for Ukraine" >}} The time zone name for Kyiv, Ukraine, which covers most of the country, has been updated. @@ -180,9 +180,9 @@ The following products and services will see the updated time zone name: - minFraud Factors - GeoLite2 City database - GeoLite2 City web service - + {{}} - +{{< release-note date="2022-09-12" title="GeoNames Monthly Diff Report September 2022" >}} [GeoNames Monthly Diff Report (September 2022)](/csv-files/GeoNames-Monthly-Diff-Report-September-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -204,9 +204,9 @@ September as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-09-12" title="Geolocation Bug Fix Complete" >}} We have completed work to fix a geolocation bug affecting some IPv6 addresses. All databases and web services should now have the updated data. @@ -214,9 +214,9 @@ updated data. See the release note [below](#geolocation-coordinate-bug-fix) for more information about this bug. - +{{}} - +{{< release-note date="2022-09-07" title="Updated GeoIP2 Enterprise Database Available" >}} We have released an updated version of the GeoIP2 Enterprise database, which fixes a geolocation bug affecting some IPv6 addresses. @@ -226,9 +226,9 @@ information about this bug. Customers should download the updated GeoIP2 Enterprise database at their earliest convenience. - +{{}} - +{{< release-note date="2022-09-07" title="Updated GeoIP2 City Database Available" >}} We have released an updated version of the GeoIP2 City database, which fixes a geolocation bug affecting some IPv6 addresses. @@ -238,9 +238,9 @@ information about this bug. Customers should download the updated GeoIP2 City database at their earliest convenience. - +{{}} - +{{< release-note date="2022-09-07" title="Geolocation Coordinate Bug Fix" >}} We are aware of a bug in which databases and web services have been returning [geolocation location coordinates](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZZP6RAYSNZTYE4MQ3MWY) @@ -266,9 +266,9 @@ implemented. We apologize for any inconvenience this may have caused. - +{{}} - +{{< release-note date="2022-08-17" title="GeoNames Monthly Diff Report August 2022" >}} [GeoNames Monthly Diff Report (August 2022)](/csv-files/GeoNames-Monthly-Diff-Report-August-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -294,9 +294,9 @@ differ for the field defined in the ‘diff_in’ column. had their names populated into the `city_name` field by error. The `city_name` field for these subdivisions has been removed. - +{{}} - +{{< release-note date="2022-07-11" title="GeoNames Monthly Diff Report July 2022" >}} [GeoNames Monthly Diff Report (July 2022)](/csv-files/GeoNames-Monthly-Diff-Report-July-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -318,9 +318,9 @@ July as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-06-15" title="GeoNames Monthly Diff Report June 2022" >}} [GeoNames Monthly Diff Report (June 2022)](/csv-files/GeoNames-Monthly-Diff-Report-June-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -342,17 +342,17 @@ June as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-06-01" title="GeoIP Legacy databases have been retired" >}} In line with the [announcement on our blog from 2020](https://blog.maxmind.com/2020/06/retirement-of-geoip-legacy-downloadable-databases-in-may-2022/), GeoIP Legacy databases have been retired. - +{{}} - +{{< release-note date="2022-05-31" title="Data changes to GeoIP Legacy web services" >}} In line with the [announcement on our blog from 2020](https://blog.maxmind.com/2020/06/data-changes-to-geoip-legacy-and-minfraud-legacy-web-services-in-may-2022/), @@ -378,9 +378,9 @@ For more information, read the Please note that [associated changes to the minFraud Legacy web services are also being made](/minfraud/release-notes/2022/#data-changes-to-minfraud-legacy-web-services). - +{{}} - +{{< release-note date="2022-05-25" title="GeoLite databases will now receive twice weekly updates" >}} Starting this Friday, May 27, GeoLite databases will be updated twice weekly, on Tuesdays and Fridays. The following databses are affected: @@ -399,9 +399,9 @@ For more information about database updates see the documentation our [Developer Portal](/geoip/updating-databases) and [Knowledge Base](https://support.maxmind.com/hc/en-us/articles/4408216129947). - +{{}} - +{{< release-note date="2022-05-10" title="GeoNames Monthly Diff Report May 2022" >}} [GeoNames Monthly Diff Report (May 2022)](/csv-files/GeoNames-Monthly-Diff-Report-May-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -423,9 +423,9 @@ May as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-04-11" title="GeoNames Monthly Diff Report April 2022" >}} [GeoNames Monthly Diff Report (April 2022)](/csv-files/GeoNames-Monthly-Diff-Report-April-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -447,9 +447,9 @@ April as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-03-11" title="GeoNames Monthly Diff Report March 2022" >}} [GeoNames Monthly Diff Report (March 2022)](/csv-files/GeoNames-Monthly-Diff-Report-March-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -471,9 +471,9 @@ March as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-02-25" title="Update Regarding IP Geolocations in Ukraine" >}} IP addresses that are geolocated to the regions of Donetsk and Luhansk currently return Ukraine for the country in MaxMind's products and services. @@ -482,9 +482,9 @@ name of the country in which an IP address is located. At this time, we do not have plans to diverge from GeoNames for IP addresses located in disputed regions. - +{{}} - +{{< release-note date="2022-02-18" title="February Holiday Database Release Schedule" >}} Due to the holidays on Monday, February 21, database updates scheduled for Tuesday, February 22 will be delayed by about one day. @@ -505,9 +505,9 @@ The GeoIP2 Anonymous IP database will continue to update as scheduled. We will resume our regular update schedule beginning on Friday, February 25. - +{{}} - +{{< release-note date="2022-02-10" title="GeoNames Monthly Diff Report February 2022" >}} [GeoNames Monthly Diff Report (February 2022)](/csv-files/GeoNames-Monthly-Diff-Report-February-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -533,9 +533,9 @@ differ for the field defined in the ‘diff_in’ column. locations in China due to some changes in how we process GeoNames data for China. - +{{}} - +{{< release-note date="2022-02-09" title="Dialup values for connection_type and user_type deprecated" >}} We have deprecated the dialup values for `connection_type` and `user_type` in our GeoIP2 products and services: @@ -554,9 +554,9 @@ our You can see a list of possible values for the `user_type` data point [in the API schema for our GeoIP2 web services](/geoip/docs/web-services/responses#schema--response--traits__user_type). - +{{}} - +{{< release-note date="2022-01-25" title="Mobile country and mobile network code data" >}} We have added data containing the mobile country code and mobile network code to several of our GeoIP2 product and services. Mobile country code and mobile network code data uniquely identify mobile network operators (carriers). This @@ -619,9 +619,9 @@ sure to keep your client API up to date to start taking advantage of this data. If you are interfacing directly with our REST API, you can begin receiving the new data right away. - +{{}} - +{{< release-note date="2022-01-10" title="GeoNames Monthly Diff Report January 2022" >}} [GeoNames Monthly Diff Report (January 2022)](/csv-files/GeoNames-Monthly-Diff-Report-January-2022.csv) GeoIP2 and GeoLite2 databases incorporate @@ -643,9 +643,9 @@ January as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2022-01-10" title="GeoIP2 Precision is now GeoIP2 web service" >}} We're dropping the "Precision" from our GeoIP2 web service names to make the closest equivalent between our web services and databases clearer, and to make it clear that IP geolocation is not precise enough to locate individuals or @@ -669,4 +669,4 @@ Our GeoIP2 web services will be renamed as follows: | GeoIP2 Precision City web service | [GeoIP2 City Plus web service](https://www.maxmind.com/en/geoip2-precision-city-service) | | GeoIP2 Precision Insights web service | [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights) | - +{{}} diff --git a/content/geoip/release-notes/2023.mdx b/content/geoip/release-notes/2023.md similarity index 87% rename from content/geoip/release-notes/2023.mdx rename to content/geoip/release-notes/2023.md index 7af6ff03d..b9ac490a0 100644 --- a/content/geoip/release-notes/2023.mdx +++ b/content/geoip/release-notes/2023.md @@ -3,7 +3,7 @@ draft: false title: GeoIP2 Release Notes - 2023 Archive --- - +{{< release-note date="2023-12-12" title="December Holiday Database Release Schedule" >}} Due to the December holidays, we will not be providing database updates for certain databases on Tuesday, December 26. The following GeoIP and GeoLite @@ -23,9 +23,9 @@ The GeoIP Anonymous IP database will continue to update as scheduled. We will resume our regular update schedule beginning on Friday, December 29. - +{{}} - +{{< release-note date="2023-12-11" title="Anycast flag available for GeoIP web services and databases" >}} The Anycast data point is now available in all GeoIP web services and all MMDB format databases. This includes GeoIP Country, GeoIP City, and GeoIP Enterprise. @@ -44,9 +44,9 @@ For more details, including what information the Anycast field will contain, please [read our previous release note on the Anycast flag](/geoip/release-notes/2023#anycast-flag-releasing-soon-for-geoip-web-services-and-databases). - +{{}} - +{{< release-note date="2023-12-11" title="GeoNames Monthly Diff Report December 2023" >}} [GeoNames Monthly Diff Report (December 2023)](/csv-files/GeoNames-Monthly-Diff-Report-December-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -77,9 +77,9 @@ including: example, `Tinh Lam GJong` is now `Lâm Đồng Province`) - a large number of locations in Brazil and India have updated `geoname_id`s - +{{}} - +{{< release-note date="2023-12-08" title="Update to Suddenlink ISP name" >}} In the Friday, December 8 release of our ISP data, we will be changing the name of ‘Suddenlink’, an American telecommunications subsidiary of Altice USA, to @@ -91,9 +91,9 @@ ISP data in the following products and services will be updated: - GeoIP Enterprise database - GeoIP ISP database - +{{}} - +{{< release-note date="2023-12-07" title="Anycast flag releasing soon for GeoIP web services and databases" >}} We’re adding a flag to identify Anycast networks in our GeoIP geolocation databases to help identify instances where we might not provide geolocation for @@ -168,9 +168,9 @@ relevant links below: - [Importing to PostgreSQL](/geoip/importing-databases/postgresql) - [Importing to MySQL](/geoip/importing-databases/mysql) - +{{}} - +{{< release-note date="2023-11-29" title="Improved postal resolution and accuracy in GeoIP products and services" >}} Over the past two weeks, we have introduced improved postal code resolution for all GeoIP products and services with city-level data, especially for large @@ -188,9 +188,9 @@ following services: - GeoIP City Plus and Insights web services - +{{}} - +{{< release-note date="2023-11-29" title="Update to KDDI Japanese ISP name" >}} In the Friday, December 1 release of our ISP data, we will be changing the name of `KDDI`, a large Japanese ISP, to `au one net` because KDDI offers its @@ -202,9 +202,9 @@ ISP data in the following products and services will be updated: - GeoIP Enterprise database - GeoIP ISP database - +{{}} - +{{< release-note date="2023-11-29" title="Updated static IP scoring for IPv6 addresses" >}} We are releasing a bug fix to our static IP scoring system today. @@ -216,9 +216,9 @@ addresses reduce. [Learn more about static IP scores in GeoIP on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408208479131-User-Context-Data#h_01FN9BSX7X351J8PV0WCH0E88F) - +{{}} - +{{< release-note date="2023-11-15" title="Special release of our geolocation databases" >}} We are issuing an off-schedule release of our geolocation databases in order to update the country-level geolocation for for a number of networks associated @@ -238,9 +238,9 @@ This impacts the following databases: GeoIP web service users will receive this update automatically. - +{{}} - +{{< release-note date="2023-11-06" title="More non-ASCII characters in English place names in GeoIP products and services" >}} Beginning this week, you will see more English place names in GeoIP products and services that contain non-ASCII characters, especially for small villages and @@ -260,9 +260,9 @@ that contain geolocation data, including: - GeoLite City and Country web services - GeoLite City and Country databases - +{{}} - +{{< release-note date="2023-10-17" title="Cloudflare WARP will be identified as a consumer privacy network" >}} Beginning Friday, October 20, Cloudflare WARP will be identified as a consumer privacy network in our data. @@ -292,9 +292,9 @@ data can be accessed in the following MaxMind products and services: [Learn more about consumer privacy networks on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408618186907-Business-VPNs-and-Consumer-Privacy-Networks) - +{{}} - +{{< release-note date="2023-10-05" title="GeoNames Monthly Diff Report October 2023" >}} [GeoNames Monthly Diff Report (October 2023)](/csv-files/GeoNames-Monthly-Diff-Report-October-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -319,9 +319,9 @@ differ for the field defined in the `diff_in` column. \* In this month's update there are changes to a number of geoname IDs for locations in Brazil. - +{{}} - +{{< release-note date="2023-09-05" title="GeoNames Monthly Diff Report September 2023" >}} [GeoNames Monthly Diff Report (September 2023)](/csv-files/GeoNames-Monthly-Diff-Report-September-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -348,9 +348,9 @@ our monthly Diff Reports, GeoNames is updating the time zones for a number of locations in Ukraine. These updates will be reflected in our `time_zone` data, which is present in all of our IP geolocation databases and web services. - +{{}} - +{{< release-note date="2023-08-28" title="New Satellite connection type releasing" >}} Effective Tuesday August 29, 2023 we will be adding a new connection type value, `Satellite`, which will identify satellite internet providers such as Starlink, @@ -368,9 +368,9 @@ version to avoid breaking changes with the new value: - [Update Java API to version 4.1.0](https://central.sonatype.com/artifact/com.maxmind.geoip2/geoip2) - [Update Node API to version 4.2.0](https://www.npmjs.com/package/@maxmind/geoip2-node) - +{{}} - +{{< release-note date="2023-08-17" title="API policies - temporary enforcement on October 17, 2023" >}} To improve our server infrastructure and allow for better performance and efficiency, MaxMind will begin enforcing our policies around our API and @@ -406,9 +406,9 @@ Developer Portal using the links below: are also a minFraud user, see [our minFraud release note on this issue.](/minfraud/release-notes/2023#api-policies---temporary-enforcement-on-october-17-2023) - +{{}} - +{{< release-note date="2023-08-10" title="GeoNames Monthly Diff Report August 2023" >}} [GeoNames Monthly Diff Report (August 2023)](/csv-files/GeoNames-Monthly-Diff-Report-August-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -433,9 +433,9 @@ differ for the field defined in the `diff_in` column. \* A number of new features with improved names were added to Brazil in this month's update. - +{{}} - +{{< release-note date="2023-08-03" title="Resolving more networks to borough of Queens, New York" >}} Starting with tomorrow's release we will begin resolving IPs that currently return the neighborhood of Flushing (Queens, NY) to the corresponding borough of @@ -444,9 +444,9 @@ Queens in the city name field. For more granular place identification (such as neighborhood), we recommend using the postal code where provided. - +{{}} - +{{< release-note date="2023-08-01" title="New Satellite connection type" >}} On Tuesday August 29, 2023 we will be adding a new connection type value, `Satellite`, which will identify satellite internet providers such as Starlink, @@ -464,9 +464,9 @@ version to avoid breaking changes with the new value: - [Update Java API to version 4.1.0](https://central.sonatype.com/search?q=g:com.maxmind.geoip2%20%20a:geoip2&smo=true) - [Update Node API to version 4.2.0](https://www.npmjs.com/package/@maxmind/geoip2-node) - +{{}} - +{{< release-note date="2023-07-10" title="GeoNames Monthly Diff Report July 2023" >}} [GeoNames Monthly Diff Report (July 2023)](/csv-files/GeoNames-Monthly-Diff-Report-July-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -491,9 +491,9 @@ differ for the field defined in the `diff_in` column. \* This month's update contains a large number of updated names for cities in Vietnam. - +{{}} - +{{< release-note date="2023-06-14" title="Twice weekly updates for the GeoIP Domain Name database" >}} Beginning this Friday, June 16, we will update the GeoIP Domain Name databases twice weekly on Tuesdays and Fridays (instead of monthly). We made this change @@ -503,9 +503,9 @@ If you would like to take advantage of these more frequent updates, you will have to update the schedule of your GeoIP database downloads. [You can find documentation on updating your GeoIP databases on our developer’s site.](/geoip/updating-databases) - +{{}} - +{{< release-note date="2023-06-12" title="Correction regarding London boroughs in our geolocation data" >}} On June 6, [we announced that more networks would be mapped to London boroughs](#more-networks-mapped-to-london-boroughs) @@ -521,9 +521,9 @@ will be populated in the second level subdivision. For example, a network that maps to the Walthamstow town will return Walthamstow for the city_name, and Walthamstow Forest for the second level subdivision. - +{{}} - +{{< release-note date="2023-06-12" title="Delayed update for GeoIP Anonymous IP database" >}} We are aware of an issue that caused a delay to the GeoIP Anonymous IP database release. The database was not released on Friday, June 9 through Sunday, @@ -532,9 +532,9 @@ June 11. The issue has been corrected, and the database will be released today, Monday, June 12, and going forward, as normal. - +{{}} - +{{< release-note date="2023-06-12" title="GeoNames Monthly Diff Report June 2023" >}} [GeoNames Monthly Diff Report (June 2023)](/csv-files/GeoNames-Monthly-Diff-Report-June-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -559,9 +559,9 @@ differ for the field defined in the `diff_in` column. \* This month's update contains a large number of updated names for cities in India. - +{{}} - +{{< release-note date="2023-06-06" title="More networks mapped to London boroughs" >}} When a network geolocates to London, we will often return the borough for the city, rather than returning London. Beginning this Friday, June 9, we will be @@ -579,9 +579,9 @@ data: - GeoLite City web service - GeoLite City database - +{{}} - +{{< release-note date="2023-05-10" title="GeoNames Monthly Diff Report May 2023" >}} [GeoNames Monthly Diff Report (May 2023)](/csv-files/GeoNames-Monthly-Diff-Report-May-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -603,16 +603,16 @@ May as they relate to the following fields: Note that the values for the `old_` and `new_` columns for a given field only differ for the field defined in the `diff_in` column. - +{{}} - +{{< release-note date="2023-05-04" title="Off-schedule GeoIP Domain database update" >}} We have released an off-schedule update to the GeoIP Domain database to correct a few minor errors. - +{{}} - +{{< release-note date="2023-04-12" title="New update schedule for GeoIP Domain database" >}} We are changing the release schedule for our GeoIP Domain database. @@ -622,9 +622,9 @@ Tuesday of each month. Previously, the GeoIP Domain database was updated every fourth Tuesday. - +{{}} - +{{< release-note date="2023-04-10" title="GeoNames Monthly Diff Report April 2023" >}} [GeoNames Monthly Diff Report (April 2023)](/csv-files/GeoNames-Monthly-Diff-Report-April-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -646,9 +646,9 @@ April as they relate to the following fields: Note that the values for the `old_` and `new_` columns for a given field only differ for the field defined in the `diff_in` column. - +{{}} - +{{< release-note date="2023-03-20" title="Issue Geolocating IPs in Portugal" >}} We are aware of an issue in which our geolocation products and services are not returning correct city-level data for IP addresses located in Portugal. @@ -669,9 +669,9 @@ Web service customers will see the corrected data right away. Database customers should download the latest update to our databases to get access to corrected data. - +{{}} - +{{< release-note date="2023-03-16" title="Changes to MaxMind License Keys" >}} We are making changes to the format of our license keys: @@ -707,9 +707,9 @@ encourage you to update to the latest version at your earliest convenience. [Learn how to upgrade from geoipupdate legacy to the current version on our Developer’s Portal.](/geoip/upgrading-geoip-update) - +{{}} - +{{< release-note date="2023-03-13" title="GeoNames Monthly Diff Report March 2023" >}} [GeoNames Monthly Diff Report (March 2023)](/csv-files/GeoNames-Monthly-Diff-Report-March-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -731,9 +731,9 @@ March as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2023-03-06" title="Geolocate Tor Exit Nodes in GeoIP and GeoLite" >}} We have added geolocation data for Tor exit nodes to all our GeoIP and GeoLite products and services with geolocation data. @@ -756,9 +756,9 @@ Geolocation data for Tor exit nodes is now present in: - GeoLite2 Country web service - GeoLite2 City web service - +{{}} - +{{< release-note date="2023-02-21" title="GeoNames Monthly Diff Report February 2023" >}} [GeoNames Monthly Diff Report (February 2023)](/csv-files/GeoNames-Monthly-Diff-Report-February-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -780,9 +780,9 @@ February as they relate to the following fields: Note that the values for the 'old' and ‘new’ columns for a given field only differ for the field defined in the ‘diff_in’ column. - +{{}} - +{{< release-note date="2023-01-23" title="Change to AT&T ISP name" >}} On Monday, February 6 we will be updating MaxMind products and services with ISP data to consolidate naming conventions for certain AT&T ISP names. We will now return `AT&T Internet` instead of `AT&T Internet Services` and `AT&T @@ -799,9 +799,9 @@ The following databases and services are affected by this change: - minFraud Insights - minFraud Factors - +{{}} - +{{< release-note date="2023-01-11" title="GeoNames Monthly Diff Report January 2023" >}} [GeoNames Monthly Diff Report (January 2023)](/csv-files/GeoNames-Monthly-Diff-Report-January-2023.csv) GeoIP2 and GeoLite2 databases incorporate @@ -826,4 +826,4 @@ differ for the field defined in the ‘diff_in’ column. \* A number of the cities in Ukraine have been updated with more accurate English names. - +{{}} diff --git a/content/geoip/release-notes/2024.mdx b/content/geoip/release-notes/2024.md similarity index 87% rename from content/geoip/release-notes/2024.mdx rename to content/geoip/release-notes/2024.md index 1b2fe4bff..7724e3c63 100644 --- a/content/geoip/release-notes/2024.mdx +++ b/content/geoip/release-notes/2024.md @@ -7,7 +7,7 @@ title: GeoIP2 Release Notes Subscribe to the [GeoIP2 release notes RSS feed](/geoip/release-notes/rss.xml). - +{{< release-note date="2024-09-10" title="GeoNames Monthly Diff Report September 2024" >}} [GeoNames Monthly Diff Report (September 2024)](/csv-files/GeoNames-Monthly-Diff-Report-September-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -33,17 +33,17 @@ differ for the field defined in the `diff_in` column. \* In this month's update, a large number of geoname IDs have been updated for Brazil. - +{{}} - +{{< release-note date="2024-08-16" title="Improved confidence factor scores" >}} On September 3, 2024, we will be releasing a significant improvement to our geolocation confidence factors. This improvement will impact around 30% of the networks in the GeoIP Insights web service and the GeoIP Enterprise database. - +{{}} - +{{< release-note date="2024-08-13" title="Increase in geolocation database sizes" >}} Our IP geolocation databases released on Tuesday, August 13, 2024 will be significantly larger than our last release. @@ -57,9 +57,9 @@ The following databases will be affected: - GeoIP Enterprise database - GeoLite City database - +{{}} - +{{< release-note date="2024-08-12" title="Off-schedule release for the GeoIP City, GeoIP Country, and GeoIP Enterprise databases" >}} Today, we are issuing an off-schedule release of the following GeoIP databases: @@ -70,9 +70,9 @@ Today, we are issuing an off-schedule release of the following GeoIP databases: We are correcting country-level information for a small number of networks associated with Microsoft Teams. - +{{}} - +{{< release-note date="2024-08-12" title="Updated postal codes for some cities in Portugal" >}} We are updating postal code data for the following major cities in Portugal: @@ -101,9 +101,9 @@ The changes will be reflected in the following products and services: - GeoLite City database - GeoLite City web service - +{{}} - +{{< release-note date="2024-08-12" title="GeoNames Monthly Diff Report August 2024" >}} [GeoNames Monthly Diff Report (August 2024)](/csv-files/GeoNames-Monthly-Diff-Report-August-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -126,33 +126,33 @@ fields: Note that the values for the `old_` and `new_` columns for a given field only differ for the field defined in the `diff_in` column. - +{{}} - +{{< release-note date="2024-08-02" title="Canceled release for GeoLite City and GeoLite Country databases" >}} The GeoLite City and GeoLite Country databases will not be released today, Friday August 2. We expect the databases to have an updated release on Tuesday, August 6. - +{{}} - +{{< release-note date="2024-07-26" title="MCC/MNC data available again in GeoIP ISP and Enterprise databases" >}} The corrected GeoIP ISP and Enterprise databases have been released, and the Mobile Country Codes (MCC) and Mobile Network Codes (MNC) data is now available. - +{{}} - +{{< release-note date="2024-07-26" title="Missing MCC/MNC data in GeoIP ISP and Enterprise databases" >}} The Mobile Country Codes (MCC) and Mobile Network Codes (MNC) data is missing from the GeoIP ISP and Enterprise databases. We expect to release a corrected build within a few hours. - +{{}} - +{{< release-note date="2024-07-23" title="Off-schedule release for the GeoIP2 City and GeoIP2 Country databases" >}} Today, we are issuing an off-schedule release of the following GeoIP databases: @@ -162,9 +162,9 @@ Today, we are issuing an off-schedule release of the following GeoIP databases: We are reverting changes for a few IPv6 networks that are not currently in use on the internet. - +{{}} - +{{< release-note date="2024-07-10" title="Increase in the number of English place names with non-ASCII characters in GeoIP® products and services" >}} You will now see an increase in the number of English place names with accented characters in GeoIP products and services. Previously, we were using the @@ -186,9 +186,9 @@ services that contain geolocation data, including: - GeoLite City and Country web services - GeoLite City and Country databases - +{{}} - +{{< release-note date="2024-07-08" title="GeoNames Monthly Diff Report July 2024" >}} [GeoNames Monthly Diff Report (July 2024)](/csv-files/GeoNames-Monthly-Diff-Report-July-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -211,9 +211,9 @@ fields: Note that the values for the `old_` and `new_` columns for a given field only differ for the field defined in the `diff_in` column. - +{{}} - +{{< release-note date="2024-06-27" title="Upcoming changes to ISP names" >}} We are updating several ISP names in our data. We expect to release these changes in new database updates and web service requests beginning Friday, July @@ -263,16 +263,16 @@ These changes will be reflected in the following products and services: - GeoIP Connection Type database - GeoIP Enterprise database - +{{}} - +{{< release-note date="2024-06-18" title="Change to GeoLite2 ASN update schedule" >}} The GeoLite2 ASN database will now be updated on a daily cadence instead of every Tuesday and Friday. - +{{}} - +{{< release-note date="2024-06-10" title="GeoNames Monthly Diff Report June 2024" >}} [GeoNames Monthly Diff Report (June 2024)](/csv-files/GeoNames-Monthly-Diff-Report-June-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -295,9 +295,9 @@ fields: Note that the values for the `old_` and `new_` columns for a given field only differ for the field defined in the `diff_in` column. - +{{}} - +{{< release-note date="2024-05-09" title="GeoNames Monthly Diff Report May 2024" >}} [GeoNames Monthly Diff Report (May 2024)](/csv-files/GeoNames-Monthly-Diff-Report-May-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -322,9 +322,9 @@ differ for the field defined in the `diff_in` column. \* In this month's update, a large number of geoname IDs have been updated for Mexico. - +{{}} - +{{< release-note date="2024-04-08" title="Upcoming changes to our TLS certificates may impact customers with unusual server configuration" >}} Starting in May, Let's Encrypt will no longer use a cross-signed root certificate, and the primary TLS certificate handling the `*.maxmind.com` @@ -339,9 +339,9 @@ your own local Certificate Authority store. - [Read more about these changes on the Cloudflare blog.](https://blog.cloudflare.com/upcoming-lets-encrypt-certificate-chain-change-and-impact-for-cloudflare-customers) - [Get information about compatibility from Let's Encrypt.](https://letsencrypt.org/docs/certificate-compatibility/) - +{{}} - +{{< release-note date="2024-04-04" title="GeoNames Monthly Diff Report April 2024" >}} [GeoNames Monthly Diff Report (April 2024)](/csv-files/GeoNames-Monthly-Diff-Report-April-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -367,9 +367,9 @@ differ for the field defined in the `diff_in` column. \* In this month's update, a large number of cities in Slovenia have improved place names. A large number of geoname IDs have been updated for Brazil. - +{{}} - +{{< release-note date="2024-03-18" title="GeoNames Monthly Diff Report March 2024" >}} [GeoNames Monthly Diff Report (March 2024)](/csv-files/GeoNames-Monthly-Diff-Report-March-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -400,9 +400,9 @@ and they have now unmerged these subdivisions. We have used the ISO subdivision codes for these subdivisions from before the 2020 change. The ISO subdivision codes we will be using for these subdivisions are reflected in this diff report. - +{{}} - +{{< release-note date="2024-03-13" title="API policies are now permanently enforced" >}} To improve our server infrastructure and allow for better performance and efficiency, our API policies are now being permanently enforced as of March @@ -438,9 +438,9 @@ on our Developer Portal using the links below: also a minFraud user, [see our minFraud release note on this issue](/minfraud/release-notes/2024#api-policies-are-now-permanently-enforced). - +{{}} - +{{< release-note date="2024-02-13" title="No GeoNames Monthly Diff Report for February 2024" >}} Due to irregularities in the latest GeoNames data, we will be maintaining the location names and codes from January. @@ -449,9 +449,9 @@ location names and codes from January. When the irregularities in the GeoNames data are resolved, we will update the data and post a new Diff Report. - +{{}} - +{{< release-note date="2024-01-25" title="API policies - temporary enforcement on February 7, 2024" >}} To improve our server infrastructure and allow for better performance and efficiency, MaxMind will begin enforcing our policies around our API and @@ -492,9 +492,9 @@ on our Developer Portal using the links below: are also a minFraud user, [see our minFraud release note on this issue.](/minfraud/release-notes/2024#api-policies---temporary-enforcement-on-february-7-2024). - +{{}} - +{{< release-note date="2024-01-17" title="Presigned URLs for database downloads" >}} We will begin using R2 presigned URLs for all database downloads in order to increase the security and reliability of our services. Database download links @@ -529,9 +529,9 @@ to download. [Review our documentation on how to update and download databases.](/geoip/updating-databases/) - +{{}} - +{{< release-note date="2024-01-17" title="Anycast flag available for CSV format databases" >}} The Anycast data point is now available in all CVS format databases—and, as [announced in a prior release note](/geoip/release-notes/2023#anycast-flag-available-for-geoip-web-services-and-databases), @@ -585,9 +585,9 @@ relevant links below: - [Importing to PostgreSQL](/geoip/importing-databases/postgresql) - [Importing to MySQL](/geoip/importing-databases/mysql) - +{{}} - +{{< release-note date="2024-01-08" title="GeoNames Monthly Diff Report January 2024" >}} [GeoNames Monthly Diff Report (January 2024)](/csv-files/GeoNames-Monthly-Diff-Report-January-2024.csv) GeoIP2 and GeoLite2 databases incorporate @@ -613,4 +613,4 @@ differ for the field defined in the `diff_in` column. \* In this month's update a large number of cities in Argentina have improved place names. - +{{}} diff --git a/layouts/release-note/rss.xml b/layouts/release-note/rss.xml new file mode 100644 index 000000000..503a5626a --- /dev/null +++ b/layouts/release-note/rss.xml @@ -0,0 +1,56 @@ +{{- /* Taken from https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml */}} +{{- $pctx := . }} +{{- if .IsHome }}{{ $pctx = .Site }}{{ end }} +{{- $pages := slice }} +{{- if or $.IsHome $.IsSection }} +{{- $pages = $pctx.RegularPages }} +{{- else }} +{{- $pages = $pctx.Pages }} +{{- end }} +{{- $limit := .Site.Config.Services.RSS.Limit }} +{{- if ge $limit 1 }} +{{- $pages = $pages | first $limit }} +{{- end }} + +{{- $chunks := slice }} + +{{- range (findRE `(?s)
|$)` .Content) }} + {{- $anchor := replaceRE `(?s).+data-anchor="(.+?)".+` "$1" . }} + {{- $title := replaceRE `(?s).+data-title="(.+?)".+` "$1" . }} + {{- $link := printf "%s#%s" $.Permalink $anchor }} + + {{- $date := replaceRE `(?s).+data-date="(.+?)".+` "$1" . }} + {{- $date = printf "%s%s" $date "T16:00:00Z" }} + + {{- $content := replaceRE `(?s).+
(.+?)(?:|$).+` "$1" . }} + {{- $content = trim $content "\n " }} + + {{- $chunks = $chunks | append (dict + "link" $link + "content" $content + "date" $date + "title" $title + ) + }} +{{- end }} + +{{- printf "" | safeHTML }} + + + {{ .Title }} + {{ .Permalink }} + {{ .Title }} + Hugo + {{ .PublishDate | time.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ printf "" .Permalink | safeHTML }} + {{- range $chunks }} + + {{ .title | safeHTML}} + {{ .link }} + {{ .date | time.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} + {{ .link }} + {{ .content | transform.XMLEscape | safeHTML }} + + {{- end }} + + diff --git a/layouts/shortcodes/release-note.html b/layouts/shortcodes/release-note.html new file mode 100644 index 000000000..31b63a9e0 --- /dev/null +++ b/layouts/shortcodes/release-note.html @@ -0,0 +1,17 @@ +{{ $title := .Get "title" }} +{{ $date := .Get "date" }} +{{ $anchor := $title | anchorize }} + +
+

+ {{ $title }} +

+ + {{ $date | time.Format ":date_long" }} + +
+ {{ .Inner | .Page.RenderString }} + {{ printf "" | safeHTML }} +
+
+{{ printf "" | safeHTML }} From 9612c74b7db380827cce818a1f6964397e40e1b6 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 09:39:29 -0400 Subject: [PATCH 04/24] Migrate minfraud release notes --- .../release-notes/{2013.mdx => 2013.md} | 8 +- .../release-notes/{2014.mdx => 2014.md} | 4 +- .../release-notes/{2015.mdx => 2015.md} | 12 +-- .../release-notes/{2016.mdx => 2016.md} | 36 ++++---- .../release-notes/{2017.mdx => 2017.md} | 29 +++--- .../release-notes/{2018.mdx => 2018.md} | 24 ++--- .../release-notes/{2019.mdx => 2019.md} | 88 +++++++++---------- .../release-notes/{2020.mdx => 2020.md} | 84 +++++++++--------- .../release-notes/{2021.mdx => 2021.md} | 32 +++---- .../release-notes/{2022.mdx => 2022.md} | 40 ++++----- .../release-notes/{2023.mdx => 2023.md} | 72 +++++++-------- .../release-notes/{2024.mdx => 2024.md} | 36 ++++---- 12 files changed, 232 insertions(+), 233 deletions(-) rename content/minfraud/release-notes/{2013.mdx => 2013.md} (92%) rename content/minfraud/release-notes/{2014.mdx => 2014.md} (85%) rename content/minfraud/release-notes/{2015.mdx => 2015.md} (91%) rename content/minfraud/release-notes/{2016.mdx => 2016.md} (81%) rename content/minfraud/release-notes/{2017.mdx => 2017.md} (73%) rename content/minfraud/release-notes/{2018.mdx => 2018.md} (81%) rename content/minfraud/release-notes/{2019.mdx => 2019.md} (83%) rename content/minfraud/release-notes/{2020.mdx => 2020.md} (79%) rename content/minfraud/release-notes/{2021.mdx => 2021.md} (88%) rename content/minfraud/release-notes/{2022.mdx => 2022.md} (87%) rename content/minfraud/release-notes/{2023.mdx => 2023.md} (86%) rename content/minfraud/release-notes/{2024.mdx => 2024.md} (89%) diff --git a/content/minfraud/release-notes/2013.mdx b/content/minfraud/release-notes/2013.md similarity index 92% rename from content/minfraud/release-notes/2013.mdx rename to content/minfraud/release-notes/2013.md index 331cd1335..e97bd3856 100644 --- a/content/minfraud/release-notes/2013.mdx +++ b/content/minfraud/release-notes/2013.md @@ -3,7 +3,7 @@ draft: false title: minFraud Release Notes - 2013 Archive --- - +{{< release-note date="2013-09-17" title="Adding IPv6 access for web endpoints" >}} We're excited to roll out IPv6 access for our web endpoints over the next few months. The rollout will be gradual to ensure a minimum of disruption for clients. We will be adding AAAA records for hostnames on the dates specified @@ -32,9 +32,9 @@ The AAAA address for US East servers will be 2607:f0d0:3:8::4. - 2013-12-09 minfraud.maxmind.com - 2013-12-09 update.maxmind.com - 2013-12-09 updates.maxmind.com - + {{}} - +{{< release-note date="2013-07-03" title="Upcoming IP address changes for MaxMind services" >}} In the coming weeks, we will be changing the IP addresses of our web service servers. If you hardcode any of our IPs in your application or your firewall, then please read the information below. If you don't hardcode our IPs, then @@ -94,4 +94,4 @@ List of affected hostnames: - updates.maxmind.com - www2.maxmind.com - www.maxmind.com - + {{}} diff --git a/content/minfraud/release-notes/2014.mdx b/content/minfraud/release-notes/2014.md similarity index 85% rename from content/minfraud/release-notes/2014.mdx rename to content/minfraud/release-notes/2014.md index f815f89e3..838685d33 100644 --- a/content/minfraud/release-notes/2014.mdx +++ b/content/minfraud/release-notes/2014.md @@ -3,7 +3,7 @@ draft: false title: minFraud Release Notes - 2014 Archive --- - +{{< release-note date="2014-08-04" title="WSDL and Port Change Required for Some minFraud SOAP Users" >}} On August 11, we will discontinue serving requests to port 8005. Users of WSDL version 2 and 4 must take action to ensure continuation of service. We ask that you upgrade your WSDL: @@ -19,4 +19,4 @@ hour starting at 1pm UTC. Please email us at support@maxmind.com if you have any questions. - +{{}} diff --git a/content/minfraud/release-notes/2015.mdx b/content/minfraud/release-notes/2015.md similarity index 91% rename from content/minfraud/release-notes/2015.mdx rename to content/minfraud/release-notes/2015.md index 67847650b..70be009ed 100644 --- a/content/minfraud/release-notes/2015.mdx +++ b/content/minfraud/release-notes/2015.md @@ -3,13 +3,13 @@ draft: false title: minFraud Release Notes - 2015 Archive --- - +{{< release-note date="2015-11-30" title="Expanded coverage of prepaid cards" >}} We are pleased to announce expanded coverage of prepaid cards in minFraud. We should return `prepaid=Yes` in minFraud premium and `is_prepaid=true` in minFraud Insights for a larger range of prepaid cards. - +{{}} - +{{< release-note date="2015-06-29" title="New beta versions of minFraud Score and minFraud Insights" >}} We've released the beta versions of two new minFraud services, minFraud Score and minFraud Inisghts. @@ -110,9 +110,9 @@ The following fields are deprecated in version 2.0: Country Match (countryMatch) has been replaced by _billing country is in IP country_ and _shipping country is in IP country_ - +{{}} - +{{< release-note date="2015-03-27" title="Discontinuing /app/ws_ipaddr" >}} On April 28, we will deactivate the `/app/ws_ipaddr` endpoint. This endpoint returns a list of IP addresses for use when making minFraud or GeoIP web service requests to MaxMind servers. @@ -130,4 +130,4 @@ Our newest API versions use hostnames instead of /app/ws_ipaddr. If you use a third-party plugin that makes requests to MaxMind web services, you may need to update it. - +{{}} diff --git a/content/minfraud/release-notes/2016.mdx b/content/minfraud/release-notes/2016.md similarity index 81% rename from content/minfraud/release-notes/2016.mdx rename to content/minfraud/release-notes/2016.md index abc59965a..0417768b8 100644 --- a/content/minfraud/release-notes/2016.mdx +++ b/content/minfraud/release-notes/2016.md @@ -3,32 +3,32 @@ draft: false title: minFraud Release Notes - 2016 Archive --- - +{{< release-note date="2016-12-05" title="minFraud's is_postal_in_city available for non-US locations" >}} minFraud's `is_postal_in_city`, `cityPostalMatch`, and `shipCityPostalMatch` outputs are available for non-US locations. - +{{}} - +{{< release-note date="2016-12-01" title="Disposition Outputs for minFraud Score, Insights, and Factors" >}} The responses for minFraud Score, Insights, and Factors may now include a [`disposition` object](/minfraud/api-documentation). This object contains information about [custom rules](https://www.maxmind.com/en/solutions/minfraud-services/custom-rules) that were applied to the request. - +{{}} - +{{< release-note date="2016-11-17" title="New /credit_card/token Input" >}} We have added a new [`/credit_card/token` input](/minfraud/api-documentation) to the minFraud Score, minFraud Insights, and minFraud Factors request bodies. The token must uniquely identify the credit card and must be different from the account number. - +{{}} - +{{< release-note date="2016-10-10" title="New event types for minFraud requests" >}} We have added two new event types to the `/event/type` field for all minFraud requests, `email_change` and `password_reset`. - +{{}} - +{{< release-note date="2016-09-06" title="More proxy scores" >}} We will be returning more proxyScores between 0 and 1.8 and 1.8 and 3. Such scores typically represent “medium” risk transactions which have some risk of fraud but may be legitimate. The higher the proxyScore, the riskier the @@ -45,25 +45,25 @@ and 75. Such scores typically represent “medium” risk transactions which hav some risk of fraud but may be legitimate. The higher the IP Risk Score, the riskier the transaction. - +{{}} - +{{< release-note date="2016-06-09" title="New Device Field" >}} `/device/confidence` and `/device/last_seen` have been added to the minFraud Insights and minFraud Factors response. These fields are only available for customers using our [Device Tracking Add-on](/minfraud/track-devices). Please see our [API documentation](/minfraud/api-documentation) for more information. - +{{}} - +{{< release-note date="2016-06-06" title="Deprecated Fields and New Fields" >}} `credits_remaining` is deprecated in the minFraud Score, minFraud Insights, and minFraud Factors response. It will be removed before the final release. It has been replaced with `queries_remaining`, which also returns the number of queries available. An additional field, `funds_remaining`, containing the US dollar value of the funds remaining will be added before the final release. - +{{}} - +{{< release-note date="2016-02-18" title="Order Amount Now Used in Risk Score" >}} All minFraud services now include an updated machine learning algorithm that takes order amount into consideration when calculating the risk score. @@ -75,9 +75,9 @@ risk score to increase. In general, orders $500 or above may have a higher risk score than before. - +{{}} - +{{< release-note date="2016-01-29" title="New minFraud Insights Outputs" >}} The following outputs have been added to minFraud Insights: - `/credit_card/brand` – The card brand, such as “Visa”, “Discover”, “American @@ -102,4 +102,4 @@ All of our client APIs have been updated to reflect these changes. For more information on these outputs, please see [our minFraud Score and minFraud Insights API documentation](/minfraud/api-documentation). - +{{}} diff --git a/content/minfraud/release-notes/2017.mdx b/content/minfraud/release-notes/2017.md similarity index 73% rename from content/minfraud/release-notes/2017.mdx rename to content/minfraud/release-notes/2017.md index 62b311287..f0bd8c29f 100644 --- a/content/minfraud/release-notes/2017.mdx +++ b/content/minfraud/release-notes/2017.md @@ -3,8 +3,7 @@ draft: false title: minFraud Release Notes - 2017 Archive --- - +{{< release-note date="2017-11-24" title="Anonymizer types added to minFraud Insights and Factors" >}} minFraud Insights and Factors services now include anonymizer-type outputs. These outputs are: @@ -23,45 +22,45 @@ As these are included via GeoIP2 Insights, please see our [GeoIP2 Web Services documentation](/geoip/docs/web-services) for more information. - +{{}} - +{{< release-note date="2017-07-24" title="Dispositions API released" >}} We have added a Dispositions API for use with Disposition setting from the Transaction Details page. Use this new API to integrate with your order management system, payment processor, or other internal system so that manual review decisions made in the MaxMind account portal are available within your own systems. More information [Here](/minfraud/working-with-transaction-dispositions). - +{{}} - +{{< release-note date="2017-07-24" title="Mapping more mobile networks to regional level" >}} We will be mapping additional mobile (cellular) networks to a region (subdivision) rather than city level. This change will only occur where the confidence in the city data is low due to the mobile provider allocating IPs over a wide area. - +{{}} - +{{< release-note date="2017-07-13" title="Custom Inputs added to minFraud Score, Insights, and Factors" >}} Customers now have the ability to create [Custom Inputs](https://support.maxmind.com/hc/en-us/articles/4408216546203-Use-Custom-Inputs) for use with our minFraud services. Custom Inputs requires the use of minFraud Score, minFraud Insights, or minFraud Factors queries. - +{{}} - +{{< release-note date="2017-07-13" title="New minFraud Input and Output parameters" >}} We have added three new parameters to minFraud Score, Insights and Factors: **Input Parameters:** `/device/session_id`, `/device/session_age`. **Output Parameter:** `/email/first_seen`. - +{{}} - +{{< release-note date="2017-06-23" title="Adding Multiple License Keys Support" >}} Our Account Portal has been updated to include the ability for our customers to create and manage multiple license keys. - +{{}} - +{{< release-note date="2017-03-17" title="minFraud Transaction History page is now minFraud Transactions Screen" >}} The minFraud Transaction History page was replaced by the minFraud Transactions Screen in support of showing dispositions. In addition, it is now possible to [set dispositions from the transaction details screen](https://support.maxmind.com/hc/en-us/articles/4408762136603-Review-a-minFraud-Transaction). - +{{}} diff --git a/content/minfraud/release-notes/2018.mdx b/content/minfraud/release-notes/2018.md similarity index 81% rename from content/minfraud/release-notes/2018.mdx rename to content/minfraud/release-notes/2018.md index a6a512cbf..71dfd8926 100644 --- a/content/minfraud/release-notes/2018.mdx +++ b/content/minfraud/release-notes/2018.md @@ -3,7 +3,7 @@ draft: false title: minFraud Release Notes - 2018 Archive --- - +{{< release-note date="2018-09-21" title="Changes to US coordinate data" >}} On Monday, October 1st, we will be changing a large amount of our U.S. coordinate (latitude & longitude) data\* to use [GeoNames](https://www.geonames.org/) coordinates for postal codes. This @@ -15,9 +15,9 @@ _\* Coordinate data is approximate and is not precise. It should not be used to identify a particular street address or household as it refers to a larger geographical area instead of a precise location._ - +{{}} - +{{< release-note date="2018-07-17" title="New input parameters for use with custom rules" >}} We have released additional input parameters for use with custom rules. Customers of minFraud Score, minFraud Insights, and minFraud Factors can now use the following inputs to serve as the basis when creating a custom rule: @@ -28,15 +28,15 @@ use the following inputs to serve as the basis when creating a custom rule: - Accept Language: `/device/accept_language` – The HTTP “Accept-Language” header of the device used in the transaction. - IP (CIDR block): `/device/ip_address` – A network CIDR block - + {{}} - +{{< release-note date="2018-05-25" title="New European Union locations added to minFraud Insights and Factors" >}} Effective May 29, 2018, we will be adding Åland Islands, Martinique, Mayotte, Guadeloupe, French Guiana, Réunion, and Saint Martin to the list of European Union locations identified by minFraud Insights and minFraud Factors responses. - +{{}} - +{{< release-note date="2018-05-18" title="Device Tracking Add-on now always uses HTTPS" >}} The HTTP request made by the Device Tracking Add-on now always uses HTTPS. Previously it used HTTP if your document was served over HTTP. This reduces compatibility with certain older versions of Internet Explorer, but will not @@ -46,9 +46,9 @@ We also recommend that you use an HTTPS URL when including the add-on in your site. We've updated the example code in [our documentation](/minfraud/track-devices) to show how to do this. - +{{}} - +{{< release-note date="2018-04-10" title="Credit card is_virtual and device local_time outputs, and payout_change event type now available!" >}} We've added two new output fields to the minFraud Insights and Factors services. The outputs are: @@ -60,9 +60,9 @@ services. The outputs are: We've also added a new event type to the `/event/type` field for all minFraud requests: `payout_change`. - +{{}} - +{{< release-note date="2018-02-13" title="EU Country outputs added to minFraud Insights and minFraud Factors services" >}} We have added additional outputs to the minFraud Insights and minFraud Factors services. The outputs are: @@ -88,4 +88,4 @@ These outputs are: As these are included via GeoIP2 Insights, please see our [GeoIP2 Web Services documentation](/geoip) for more information. - +{{}} diff --git a/content/minfraud/release-notes/2019.mdx b/content/minfraud/release-notes/2019.md similarity index 83% rename from content/minfraud/release-notes/2019.mdx rename to content/minfraud/release-notes/2019.md index 10a54b0ac..f8844b9b3 100644 --- a/content/minfraud/release-notes/2019.mdx +++ b/content/minfraud/release-notes/2019.md @@ -3,21 +3,21 @@ draft: false title: minFraud Release Notes - 2019 Archive --- - +{{< release-note date="2019-12-23" title="The USER_ID_REQUIRED error code is now ACCOUNT_ID_REQUIRED" >}} Our web services, including [GeoIP2 web services](https://www.maxmind.com/en/geoip2-precision-insights) and [minFraud services](https://www.maxmind.com/en/solutions/minfraud-services), now return the error code `ACCOUNT_ID_REQUIRED` instead of `USER_ID_REQUIRED` when the account ID parameter is missing. - +{{}} - +{{< release-note date="2019-12-17" title="Query usage report license key filter" >}} You can now filter by license key when viewing the [query usage report](https://www.maxmind.com/en/accounts/current/query-usage-report) \[login required\] in your account portal. - +{{}} - +{{< release-note date="2019-12-11" title="Toggle minFraud Transactions Access" >}} Account administrators can now enable or disable access to the [minFraud Transactions page](https://www.maxmind.com/en/accounts/current/minfraud-interactive/transactions) @@ -31,31 +31,31 @@ exporting transactions. See our [guide](https://support.maxmind.com/hc/en-us/articles/4408762136603-Review-a-minFraud-Transaction) for more info. - +{{}} - +{{< release-note date="2019-12-11" title="Changes to Japan Postal Codes" >}} Effective December 16, 2019, we will return `1` as the last digit for all 7 digit postal codes in Japan. The last digit refers to [street-level resolution](https://en.wikipedia.org/wiki/Postal_codes_in_Japan) and should not be relied upon for IP geolocation. - +{{}} - +{{< release-note date="2019-11-08" title="Changes to Portugal Postal Codes" >}} Effective November 12, 2019, we will return `-001` as the last 3 digits for all 7 digit postal codes in Lisbon, Portugal. Our postal code resolution in Portugal is accurate for the first 4 digits and we include the `-001` at the end for backwards compatibility for customers to join the data with 7 digit Portuguese postal code databases. We may extend this convention to other large Portuguese cities in the future. - +{{}} - +{{< release-note date="2019-10-16" title="Retirement of TLS 1.0/1.1 and unencrypted http minFraud requests" >}} We retired support for TLS v1.0/v1.1 and unencrypted HTTP requests to minFraud services today, as part of our commitment to securing and protecting your data. Please ensure you are using TLS v1.2+ to connect to MaxMind services. - +{{}} - +{{< release-note date="2019-10-15" title="New static_ip_score output in web services" >}} The following output has been added to the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights), and [minFraud Insights and Factors web @@ -71,9 +71,9 @@ services](https://www.maxmind.com/en/solutions/minfraud-services): The `static_ip_score` output is present in the `traits` object. - +{{}} - +{{< release-note date="2019-10-14" title="Final reminder of security-related retirements" >}} This is a reminder that we are retiring support for requests using TLS 1.0/1.1, and unencrypted HTTP requests to MaxMind minFraud services on **October 16, 2019**. After October 16, 2019, these types of requests will always fail with @@ -84,9 +84,9 @@ so. [Contact us](https://support.maxmind.com/hc/en-us/requests/new) for support or if you have questions. - +{{}} - +{{< release-note date="2019-10-03" title="Improved cellular IP detection" >}} We have made improvements to how we identify cellular IPs for the `connection_type` field provided in the [GeoIP2 Connection Type database](https://www.maxmind.com/en/geoip2-connection-type-database), and the @@ -94,9 +94,9 @@ database](https://www.maxmind.com/en/geoip2-connection-type-database), and the service](https://www.maxmind.com/en/geoip2-precision-insights) and [minFraud services](https://www.maxmind.com/en/solutions/minfraud-services). Accuracy for cellular identification should now be about 95% accurate globally. - +{{}} - +{{< release-note date="2019-10-02" title="Account activity log" >}} You can now view a log of your MaxMind account activity, which includes a time stamp, requester, and subject, for the each of the following actions: @@ -111,17 +111,17 @@ activity log in your account portal under 'Account Information' or [here](https://www.maxmind.com/en/accounts/current/activity-log) \[login required\]. - +{{}} - +{{< release-note date="2019-09-30" title="High risk IP country deprecation" >}} We've deprecated the `/ip_address/country/is_high_risk` output in [minFraud Insights and minFraud Factors](/minfraud) (and highRiskCountry output in [legacy minFraud services](/minfraud/minfraud-legacy)) because it provides limited value. You can find the IP country in the `/ip_address/country/names` output. - +{{}} - +{{< release-note date="2019-09-19" title="New network and user_count outputs in web services" >}} The following outputs have been added to the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights), and [minFraud Insights and Factors web @@ -137,9 +137,9 @@ services](https://www.maxmind.com/en/solutions/minfraud-services): Both of these outputs are present in the `traits` object. - +{{}} - +{{< release-note date="2019-09-16" title="Planned warning interruption (September 2019)" >}} **8-hour interruption of old TLS and unencrypted minFraud requests on September 25, 2019** @@ -159,27 +159,27 @@ you have any questions, please do not hesitate to is available on our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/). - +{{}} - +{{< release-note date="2019-08-29" title="IP and email tenure deprecation" >}} Effective August 29th, 2019, we have deprecated the `/subscores/ip_tenure` and `subscores/email_tenure` risk-factor outputs in the minFraud Factors service because they provided limited value. The subscores will default to 1 and will be removed in a future release. The IP tenure is reflected in the overall risk score. The user tenure on email is reflected in the `/subscores/email_address` output. - +{{}} - +{{< release-note date="2019-08-21" title="Improved business IP detection" >}} We have made improvements in how we detect business IPs for the user type field provided as part of the [GeoIP2 Insights web service](https://www.maxmind.com/en/geoip2-precision-insights) and [minFraud services](https://www.maxmind.com/en/solutions/minfraud-services). Approximately 1% of residential IPs were recently corrected to the appropriate business user type as a result of these improvements. - +{{}} - +{{< release-note date="2019-08-20" title="Planned warning interruption (August 2019)" >}} **8-hour interruption of old TLS and unencrypted minFraud requests on August 28, 2019** @@ -199,9 +199,9 @@ you have any questions, please do not hesitate to is available on our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/). - +{{}} - +{{< release-note date="2019-08-05" title="Retirement of legacy IIN (BIN) API service" >}} We are discontinuing the legacy IIN (BIN) API on **January 31, 2020** in order to focus development and maintenance efforts on our core services. This means that the service will no longer function if you are querying the URL below: @@ -215,9 +215,9 @@ API because of volume considerations, we recommend either using our (IP address is a required input field) or integrating an alternative commercially available solution. - +{{}} - +{{< release-note date="2019-07-24" title="Planned warning interruption" >}} There will be a planned service interruption for all requests to MaxMind services that use TLS versions 1.0 and 1.1, and for unencrypted HTTP requests to MaxMind legacy minFraud services (e.g. minFraud Standard, minFraud Premium, @@ -238,9 +238,9 @@ you have any questions, please do not hesitate to is available on our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/). - +{{}} - +{{< release-note date="2019-07-22" title="Disable IP Risk" >}} You can now manage a list of IP addresses and networks that you want to exempt from IP risk scoring. This is helpful when the IP address is known to be unrelated to the end-customer, such as when you have transactions coming from a @@ -248,30 +248,30 @@ call center or agent. Adding an IP address or network to the exclusion list will ensure IP risk is neither calculated nor considered when determining the riskScore for transactions associated with excluded IPs. [Learn more](https://support.maxmind.com/hc/en-us/articles/4407972664347-Disable-IP-Risk-Scoring) - +{{}} - +{{< release-note date="2019-06-14" title="Initial release of minFraud-node" >}} We have added Node.js as a MaxMind Supported minFraud API ([NPM](https://npmjs.com/package/@maxmind/minfraud-api-node), [GitHub](https://maxmind.github.io/minfraud-api-node/)). It provides an API for the [minFraud Score, Insights, and Factors services](https://www.maxmind.com/en/solutions/minfraud-services). - +{{}} - +{{< release-note date="2019-04-18" title="Security-related retirements 2019" >}} In order to ensure your data is as safe and secure as possible, we will be retiring support for TLS v1.0 and 1.1, unencrypted HTTP requests to our legacy minFraud services, and our legacy minFraud SOAP API in the coming months. Please see our [blog](https://blog.maxmind.com/2019/04/important-updates-about-tls-v1-0-v1-1-unencrypted-http-requests-and-the-legacy-minfraud-soap-api/) for more info. - +{{}} - +{{< release-note date="2019-04-08" title="2FA release" >}} To enhance the security of your MaxMind account, Chrome users can enable two-factor authentication (2FA). You can now add and require a (FIDO U2F) security key on top of your account credentials for a more secure log-in. See our [support center user guide](https://support.maxmind.com/hc/en-us/articles/1260803946470-Set-Up-Two-Factor-Authentication) for information on how to set up 2FA. - +{{}} diff --git a/content/minfraud/release-notes/2020.mdx b/content/minfraud/release-notes/2020.md similarity index 79% rename from content/minfraud/release-notes/2020.mdx rename to content/minfraud/release-notes/2020.md index b2f05f180..2eeb6f0a3 100644 --- a/content/minfraud/release-notes/2020.mdx +++ b/content/minfraud/release-notes/2020.md @@ -3,14 +3,14 @@ draft: false title: minFraud Release Notes - 2020 Archive --- - +{{< release-note date="2020-12-30" title="United Kingdom will no longer be flagged is_in_european_union" >}} Effective January 5, 2021, the `is_in_european_union` flag will no longer be marked true for locations in the United Kingdom. This change will be reflected in the data in GeoLite2 databases and web services, GeoIP2 databases, GeoIP2 web services, and minFraud Insights and Factors services. - +{{}} - +{{< release-note date="2020-10-20" title="New Output is_residential_proxy Released for GeoIP2 Insights Web Service, minFraud Insights, and minFraud Factors" >}} We have released an additional output for our web services. [GeoIP2 Insights](https://www.maxmind.com/en/geoip2-precision-services), [minFraud Insights, and minFraud @@ -26,9 +26,9 @@ Our [client APIs](/minfraud/evaluate-a-transaction#links-to-maxmind-client-apis) have been updated to support these outputs so may need to refresh yours if you are not interfacing directly with our REST API. - +{{}} - +{{< release-note date="2020-10-12" title="IP Address Optional in minFraud Score, Insights, and Factors Services" >}} Effective October 12, 2020 we are making the IP address input optional for all minFraud Score, Insights, and Factors queries. If you use these minFraud services for transactions where the IP address is not relevant (e.g. a phone @@ -38,9 +38,9 @@ addresses, when applicable), the better the scoring the minFraud service will provide. See the [relevant FAQ on our Support Center](https://support.maxmind.com/hc/en-us/articles/4407964824859-Pass-Inputs-to-minFraud) for more information. - +{{}} - +{{< release-note date="2020-10-06" title="IP Address Optional in minFraud Score, Insights, and Factors Services" >}} Effective October 12, 2020 we are making the IP address input optional for all minFraud Score, Insights, and Factors queries. If you use these minFraud services for transactions where the IP address is not relevant (e.g. a phone @@ -50,9 +50,9 @@ addresses, when applicable), the better the scoring the minFraud service will provide. See [the relevant FAQ on our Support Center](https://support.maxmind.com/hc/en-us/articles/4407964824859-Pass-Inputs-to-minFraud) for more information. - +{{}} - +{{< release-note date="2020-09-14" title="Email Now Available as Custom Rules Parameter" >}} We have released an additional input parameter for use with custom rules. Customers of [minFraud Score, minFraud Insights, and minFraud Factors](/minfraud) can now use email address to serve as the basis when @@ -64,26 +64,26 @@ creating a custom rule: For more information on implementing custom rules, see the [Custom Rules Guide on our Support Center](https://support.maxmind.com/hc/en-us/articles/4408801942811-Use-Custom-Rules-and-Dispositions). - +{{}} - +{{< release-note date="2020-09-10" title="Billing and Product/Service Permission Types for Standard Users" >}} We have added a new permission category for the Standard User type. The Product/Service permission grants a Standard User access to product and service related functionality in the account portal without having access to user management and billing functionality. For more information, consult our [Multi-User Account Access Guide](https://support.maxmind.com/hc/en-us/articles/4407107969947-Manage-Multiple-Users). - +{{}} - +{{< release-note date="2020-08-10" title="Update to minFraud service server locations" >}} Effective August 17, 2020, we will no longer serve minFraud service queries from our London-area servers. These queries will automatically be re-routed to our US-East servers. You do not need to take any action as a result of this change. Customers who have previously had queries routed to these servers may see an increase of 100 – 150 ms in the response time for your queries. - +{{}} - +{{< release-note date="2020-08-06" title="New minFraud Factors risk factors" >}} We have released three additional risk-factor outputs. Customers of [minFraud Factors](/minfraud) can now access the following risk factors: @@ -96,9 +96,9 @@ Our [client APIs](/minfraud/evaluate-a-transaction#links-to-maxmind-client-apis) have been updated to support these outputs so may need to refresh yours if you are not interfacing directly with our rest API. - +{{}} - +{{< release-note date="2020-06-24" title="Report transaction support in minFraud client APIs" >}} The [minFraud Score, Insights, and Factors](/minfraud) client APIs now support sending transaction feedback to our [Report Transaction endpoint](/minfraud/report-a-transaction). This will allow you to more @@ -106,25 +106,25 @@ easily report fraud, suspected fraud, spam/abuse, and false positives to improve scoring. You can find more details on using this functionality in the [documentation for the specific client API you use](/minfraud/evaluate-a-transaction#links-to-maxmind-client-apis). - +{{}} - +{{< release-note date="2020-06-22" title="FIDO2 Support for Two-Factor Authentication" >}} We've updated our Two-Factor Authentication (2FA) implementation to the [FIDO2 standard](https://fidoalliance.org/fido2/), which supports more web browsers and more types of security keys (e.g. supported biometrics keys). See our [Two-Factor Authentication (2FA) User Guide for more information](https://support.maxmind.com/hc/en-us/articles/1260803946470-Set-Up-Two-Factor-Authentication). - +{{}} - +{{< release-note date="2020-06-15" title="Data Changes to GeoIP Legacy and minFraud Legacy Web Services" >}} We are planning to make a number of data changes to the minFraud Legacy Standard and Premium, and GeoIP Legacy City and Insights (formerly Omni) web services at the end of May 2022. Please see our [blog post](https://blog.maxmind.com/2020/06/data-changes-to-geoip-legacy-and-minfraud-legacy-web-services-in-may-2022/) for more information, and how to prepare. - +{{}} - +{{< release-note date="2020-05-14" title="Anonymous IP flags as parameters for custom rules" >}} Customers of [minFraud Insights and minFraud Factors](/minfraud) can now use the following [Anonymous IP outputs](/geoip/docs/web-services/responses/#schema--response--traits) as parameters to serve as the basis when creating a custom rule: @@ -134,9 +134,9 @@ serve as the basis when creating a custom rule: - `/ip_address/traits/is_hosting_provider` - `/ip_address/traits/is_public_proxy` - `/ip_address/traits/is_tor_exit_node` - + {{}} - +{{< release-note date="2020-05-08" title="Retirement of legacy minFraud SOAP API" >}} On May 8, 2020, we discontinued our legacy minFraud SOAP API in order to focus our development on our newer current APIs. We initially [announced this retirement in April @@ -147,9 +147,9 @@ recommended) will continue to be supported. We recommend either integrating with the [legacy minFraud service directly](/minfraud/minfraud-legacy), or using our [current minFraud services](/minfraud). - +{{}} - +{{< release-note date="2020-04-27" title="Billing fields and is disposable email as input parameters for custom rules" >}} We have released additional input parameters for use with custom rules. Customers of [minFraud Score, minFraud Insights, and minFraud Factors](/minfraud) can now use the following inputs to serve as the basis when @@ -160,21 +160,21 @@ creating a custom rule: - `/email/is_disposable` – This field is true if MaxMind believes that the email address is from a disposable email provider. It is false if the address is not from a known disposable email provider. - + {{}} - +{{< release-note date="2020-04-06" title="New /credit_card/is_business output" >}} The `/credit_card/is_business` output is now available in minFraud Insights and Factors. This field is `true` if the issuer ID number is for a business card. - +{{}} - +{{< release-note date="2020-03-24" title="New /email/domain/first_seen output" >}} The `/email/domain/first_seen` output is now available in minFraud Insights and Factors. This output is a date string (e.g. 2020-03-24) indicating the date the email address domain was first seen by MaxMind. The earliest date that may be returned is January 1, 2019. - +{{}} - +{{< release-note date="2020-03-02" title="minFraud Query Form" >}} Users of the minFraud Score, Insights, and Factors services can now manually submit minFraud queries (with a subset of inputs) through the new [minFraud Query @@ -182,15 +182,15 @@ Form](https://www.maxmind.com/en/accounts/current/minfraud-interactive/query-for \[login required\]. The results of the query are displayed in our [minFraud Interactive](https://support.maxmind.com/hc/en-us/articles/4408762136603-Review-a-minFraud-Transaction) user interface. - +{{}} - +{{< release-note date="2020-02-19" title="New /email/is_disposable output" >}} The `/email/is_disposable` output is now available in minFraud Insights and Factors. The output is a boolean indicating whether the email address is from a disposable email provider. - +{{}} - +{{< release-note date="2020-02-04" title="More outputs on transaction details screen" >}} We've added the following outputs to the Transaction Details screen in [minFraud Interactive](https://support.maxmind.com/hc/en-us/articles/4408762136603-Review-a-minFraud-Transaction) @@ -211,9 +211,9 @@ to assist you with manual review of minFraud transactions: You can find descriptions of these outputs [here](/geoip/docs/web-services/responses). - +{{}} - +{{< release-note date="2020-01-31" title="Retirement of legacy IIN (BIN) API" >}} On January 31, 2020, we discontinued our legacy IIN (BIN) API in order to focus development and maintenance efforts on our core services. The affected endpoint is `/app/bin_http`. @@ -222,9 +222,9 @@ We continue to support the IIN (BIN) [manual look-up form on our website](https://www.maxmind.com/en/accounts/current/minfraud/iin/lookup) \[login required\]. - +{{}} - +{{< release-note date="2020-01-29" title="Tag transactions from transaction details screen" >}} minFraud service users can now tag transactions (e.g. chargeback, not fraud, spam/abuse, suspected fraud) directly from the Transaction Details screen for an individual transaction in [minFraud @@ -234,4 +234,4 @@ Tagging transactions allows us to detect 10-50% more fraud for you. You may also tag transactions outside of minFraud Interactive by using [this form](https://www.maxmind.com/en/accounts/current/minfraud/report-transactions). - +{{}} diff --git a/content/minfraud/release-notes/2021.mdx b/content/minfraud/release-notes/2021.md similarity index 88% rename from content/minfraud/release-notes/2021.mdx rename to content/minfraud/release-notes/2021.md index e11f95644..cbbbff4b5 100644 --- a/content/minfraud/release-notes/2021.mdx +++ b/content/minfraud/release-notes/2021.md @@ -3,7 +3,7 @@ draft: false title: minFraud Release Notes - 2021 Archive --- - +{{< release-note date="2021-09-23" title="Update to minimum accuracy_radius value" >}} Effective October 4, 2021, the minimum accuracy radius value will be 5km across our city/postal-level geolocation products and services. Previously, the minimum accuracy radius value was 1km. This change applies to the following products and @@ -19,9 +19,9 @@ services: We are making this change in order to ensure it is clear that IP geolocation should not be used to identify a particular street address or household. - +{{}} - +{{< release-note date="2021-09-08" title="Data Updates for Apple iCloud Private Relay" >}} We have updated our data in a number of ways in preparation for the rollout of [iCloud Private Relay](https://developer.apple.com/support/prepare-your-network-for-icloud-private-relay/). We have worked with Apple to ensure that our data accurately reflects how @@ -61,9 +61,9 @@ on Apple’s developer website. We will continue to monitor these IPs and make any adjustments that are needed in the future. - +{{}} - +{{< release-note date="2021-09-03" title="New minFraud features: passing 3-D Secure outcome, custom rule label in minFraud response, “test” disposition for custom rules" >}} We have released a couple of new features for the [minFraud Score, Insights, and Factors service](https://www.maxmind.com/en/solutions/minfraud-services). @@ -88,9 +88,9 @@ Our [client APIs](/minfraud/evaluate-a-transaction#links-to-maxmind-client-apis) have been updated to support these outputs so may need to refresh yours if you are not interfacing directly with our REST API. - +{{}} - +{{< release-note date="2021-05-19" title="Updated warning codes in minFraud Score, Insights, and Factors" >}} We updated warning codes for [minFraud Score, Insights and Factors](/minfraud) responses in the [/warnings/ object](/minfraud/api-documentation/responses/#schema--response--warnings). @@ -107,16 +107,16 @@ object](/minfraud/api-documentation/responses/#schema--response--warnings). See our developer documentation for the [updated codes and warnings](/minfraud/api-documentation/responses/#schema--response--warnings). - +{{}} - +{{< release-note date="2021-05-13" title="Updates to minFraud Alerts" >}} We recently made some updates to minFraud alerts, which notifies minFraud users about previously low-risk transactions that are now high-risk due to updated information. Learn more [on our blog](https://blog.maxmind.com/2021/05/what-are-minfraud-alerts-and-what-do-i-do-with-them/). - +{{}} - +{{< release-note date="2021-02-22" title="Normalize Emails Before Hashing for Improved minFraud Scoring" >}} The client APIs for minFraud Score, Insights, and Factors now normalize emails prior to hashing them for improved risk scoring. Email normalization ensures that minor, inconsequential differences in the email input (i.e., @@ -131,9 +131,9 @@ Legacy, we recommend that you normalize email addresses prior to hashing. Please see our developer’s site for [guidance on how to normalize emails](/minfraud/normalizing-email-addresses-for-minfraud). - +{{}} - +{{< release-note date="2021-02-03" title="New output IP risk reasons" >}} The `ip_address/risk_reasons` output is now available. [minFraud Insights](https://www.maxmind.com/en/solutions/minfraud-services) and [minFraud Factors](https://www.maxmind.com/en/solutions/minfraud-services/minfraud-factors) @@ -162,9 +162,9 @@ have been updated to support this output so you may need to refresh yours in order to see the new output if you are not interfacing directly with our REST API. - +{{}} - +{{< release-note date="2021-01-22" title="Change to Vodafone Germany ISP name" >}} On Monday, January 25 we will be updating MaxMind products and services with ISP data to consolidate naming conventions for Vodafone Germany. We will now return either `Vodafone Germany Cable`, `Vodafone Germany DSL`, `Vodafone @@ -172,4 +172,4 @@ Germany Business`, or `Vodafone Germany`. Previous values were `Vodafone GmbH`, `Vodafone Germany`, and `Vodafone DSL`. We are updating these values to more accurately reflect the type of connection that the IP address is associated with. - +{{}} diff --git a/content/minfraud/release-notes/2022.mdx b/content/minfraud/release-notes/2022.md similarity index 87% rename from content/minfraud/release-notes/2022.mdx rename to content/minfraud/release-notes/2022.md index 0a8f412e8..f98c5592e 100644 --- a/content/minfraud/release-notes/2022.mdx +++ b/content/minfraud/release-notes/2022.md @@ -3,7 +3,7 @@ draft: false title: minFraud Release Notes - 2022 Archive --- - +{{< release-note date="2022-10-11" title="MaxMind Sandbox has Launched" >}} We've launched a new Sandbox Environment for technical validation and testing of your integration with our minFraud and GeoIP web services. The Sandbox environment is available for all paying MaxMind customers. @@ -12,9 +12,9 @@ environment is available for all paying MaxMind customers. [You can also read more about testing minFraud web services on the Sandbox.](/minfraud/sandbox-environment) - +{{}} - +{{< release-note date="2022-09-26" title="Changes to Registered Country data" >}} We have made some changes to how we determine the registered country associated with an IP address. We estimate that this change will affect around 1% of IP addresses with a registered country value. The following databases and web @@ -40,9 +40,9 @@ IP, it will be removed. In other cases, the value may be changed. [You can learn more about the difference between registered country and the IP geolocation on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414762983195-Country-level-and-City-level-Geolocation) - +{{}} - +{{< release-note date="2022-09-14" title="Change to Time Zone Name for Ukraine" >}} The time zone name for Kyiv, Ukraine, which covers most of the country, has been updated. @@ -60,9 +60,9 @@ The following products and services will see the updated time zone name: - minFraud Factors - GeoLite2 City database - GeoLite2 City web service - + {{}} - +{{< release-note date="2022-09-12" title="Geolocation Bug Fix Complete" >}} We have completed work to fix a geolocation bug affecting some IPv6 addresses. All databases and web services should now have the updated data. @@ -70,9 +70,9 @@ updated data. See the release note [below](#geolocation-coordinate-bug-fix) for more information about this bug. - +{{}} - +{{< release-note date="2022-09-07" title="Geolocation Coordinate Bug Fix" >}} We are aware of a bug in which databases and web services have been returning [geolocation location coordinates](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZZP6RAYSNZTYE4MQ3MWY) @@ -98,9 +98,9 @@ implemented. We apologize for any inconvenience this may have caused. - +{{}} - +{{< release-note date="2022-05-31" title="Data changes to minFraud Legacy web services" >}} In line with the [announcement on our blog from 2020](https://blog.maxmind.com/2020/06/data-changes-to-geoip-legacy-and-minfraud-legacy-web-services-in-may-2022/), @@ -126,9 +126,9 @@ For more information, read the Please note that [associated changes to the GeoIP Legacy web services are also being made](/geoip/release-notes/2022/#data-changes-to-geoip-legacy-web-services). - +{{}} - +{{< release-note date="2022-03-01" title="Expanded filtering options in the account portal for minFraud transactions" >}} The transaction review screen in your MaxMind account portal now has expanded options to filter your transactions. You may now filter transactions by: @@ -142,9 +142,9 @@ options to filter your transactions. You may now filter transactions by: [You can learn more about how to filter and search transactions using your MaxMind account portal on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408755037851-Search-the-Log-of-my-minFraud-Transactions) - +{{}} - +{{< release-note date="2022-01-31" title="minFraud services now handle 8 digit IINs" >}} We have updated the minFraud service to handle 8 digit credit card issuer ID numbers (IINs). These are non-breaking changes. @@ -174,18 +174,18 @@ If you would like to learn more about how to properly handle credit card numbers, you can read more at [pcisecuritystandards.org](https://pcisecuritystandards.org). - +{{}} - +{{< release-note date="2022-01-14" title="minFraud alerts webhook now supports signed requests" >}} [minFraud alerts](/minfraud/alerts) now support signed requests for webhook delivery. You can now set a secret, which can be used to verify the authenticity of a minFraud alert delivered via webhook. See our [minFraud Alert documentation](/minfraud/alerts#signed-requests) for instructions. - +{{}} - +{{< release-note date="2022-01-10" title="minFraud subscores are now minFraud risk factor scores" >}} We have renamed minFraud subscores to be "risk factor scores" to make it clearer that the scores returned in our minFraud Factors web service are actionable risk scores in their own right, similar to the IP risk score. [You can learn more @@ -198,4 +198,4 @@ minFraud Factors queries will continue to return risk factor scores in the `subscores` object. [Learn more about the subscores object.](/minfraud/api-documentation/responses#schema--response--subscores) - +{{}} diff --git a/content/minfraud/release-notes/2023.mdx b/content/minfraud/release-notes/2023.md similarity index 86% rename from content/minfraud/release-notes/2023.mdx rename to content/minfraud/release-notes/2023.md index 430b9b190..2a2c59f09 100644 --- a/content/minfraud/release-notes/2023.mdx +++ b/content/minfraud/release-notes/2023.md @@ -3,7 +3,7 @@ draft: false title: minFraud Release Notes - 2023 Archive --- - +{{< release-note date="2023-12-11" title="Session age input can be used as a parameter for custom rules" >}} You can now use the `/device/session_age` input in minFraud custom rules. Session age can be used to detect patterns of device usage across multiple @@ -16,9 +16,9 @@ minFraud inputs > Session age when defining a new condition for a custom rule. - [Learn more about setting custom rule conditions on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408362750875#h_01HBNQ01QST1MPM481ZW520R7J) - [Learn more about session inputs on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5444495353883-Device-Inputs#h_01G0YJ77MFVS4XW63W9G2Y1Y65) - +{{}} - +{{< release-note date="2023-12-04" title="ISP output can be used as a parameter for custom rules" >}} You can now use the `/ip_address/traits/isp` output in minFraud custom rules, with the following operators: matches, does not match, contains, does not @@ -32,9 +32,9 @@ minFraud outputs > ISP when defining a new condition for a custom rule. - [Learn more about setting custom rule conditions on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408362750875#h_01HBNQ01QST1MPM481ZW520R7J) - +{{}} - +{{< release-note date="2023-11-29" title="Updated static IP scoring for IPv6 addresses" >}} We are releasing a bug fix to our static IP scoring system today. @@ -47,9 +47,9 @@ for these networks for all minFraud customers. [Learn more about static IP scores in minFraud on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408430082971-IP-Trait-Risk-Data#h_01FN6V82S7EZNGE45GCRE1JERV) - +{{}} - +{{< release-note date="2023-11-16" title="Free email output can be used as a parameter for custom rules" >}} You can now use the `/email/is_free` output in minFraud custom rules. This output is available for transactions submitted through minFraud Insights and @@ -70,9 +70,9 @@ rule. - [Learn more about free email detection on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data#h_01FN6V5QYMX2DYRB4YSFM93F8D) - [Learn more about passing email inputs on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5451485951387-Email-Inputs) - +{{}} - +{{< release-note date="2023-11-15" title="Create stored lists of email addresses to use in minFraud custom rules" >}} You can now add up to 2000 emails to a stored list and use it within minFraud custom rules to automatically apply a disposition to all matching transactions. @@ -81,9 +81,9 @@ address. [Learn more about stored lists on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/20075901236891-Use-Stored-Lists-in-Custom-Rules) - +{{}} - +{{< release-note date="2023-09-29" title="Improvements to IP risk score" >}} We have made some improvements to the IP risk score, and minFraud customers may see an average increase of 1.5% in their risk scores beginning Monday, @@ -97,18 +97,18 @@ scoring. This change will apply to the following data: - [Proxy score](/minfraud/proxy-detection) (available in our Legacy Proxy detection web service) - +{{}} - +{{< release-note date="2023-09-26" title="Group and join up to 20 conditions in minFraud custom rules" >}} When using minFraud's custom rules, you can now group and join up to 20 conditions. The previous limit was 4 conditions. [Learn more about custom rules on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408826227227) - +{{}} - +{{< release-note date="2023-08-30" title="More Virtual Payment Cards Flagged in minFraud" >}} Effective September 1, 2023 we will be flagging more virtual payment cards from select digital banks in minFraud. In transactions where the IIN is submitted, @@ -129,9 +129,9 @@ a submitted payment card is virtual using the `credit_card/is_virtual` output: - [Learn more about prepaid and virtual card detection on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408734452123-Credit-Card-Risk-Data#h_01FN6TXRB1E35Q7Z7BGENRV7MC) - [See the documentation for this output in the API schema on our Developer Portal.](/minfraud/api-documentation/responses#schema--response--credit-card__is_virtual) - +{{}} - +{{< release-note date="2023-08-17" title="API policies - temporary enforcement on October 17, 2023" >}} To improve our server infrastructure and allow for better performance and efficiency, MaxMind will begin enforcing our policies around our API and @@ -163,9 +163,9 @@ using the links below: are also a GeoIP user, see [our GeoIP release note on this issue](/geoip/release-notes/2023#api-policies---temporary-enforcement-on-october-17-2023). - +{{}} - +{{< release-note date="2023-07-20" title="Expanded filtering options in minFraud Interactive" >}} Within minFraud Interactive, the interface provided in your account portal for searching, filtering, reviewing, and submitting minFraud transactions, you can @@ -191,9 +191,9 @@ inputs with this release are marked with an asterix): [You can learn more about minFraud Interactive's log of your transactions on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408754902171-View-the-Log-of-my-minFraud-Transactions) - +{{}} - +{{< release-note date="2023-07-17" title="Data retention increased for minFraud Interactive" >}} Effective immediately, we will begin to retain data in minFraud Interactive for up to 5 months. Although this change is already in place, you will not notice @@ -205,9 +205,9 @@ minFraud Interactive is the interface for searching, filtering, and viewing minFraud transactions through your account portal. [Learn more about minFraud Interactive on our Knowledge Base.](https://support.maxmind.com/hc/en-us/sections/4408742510619-Submit-and-Review-Transactions) - +{{}} - +{{< release-note date="2023-06-12" title="Correction regarding London boroughs in our geolocation data" >}} On June 6, [we announced that more networks would be mapped to London boroughs](#more-networks-mapped-to-london-boroughs) @@ -223,9 +223,9 @@ will be populated in the second level subdivision. For example, a network that maps to the Walthamstow town will return Walthamstow for the city_name, and Walthamstow Forest for the second level subdivision. - +{{}} - +{{< release-note date="2023-06-06" title="More networks mapped to London boroughs" >}} When a network geolocates to London, we will often return the borough for the city, rather than returning London. Beginning this Friday, June 9, we will be @@ -243,18 +243,18 @@ data: - GeoLite City web service - GeoLite City database - +{{}} - +{{< release-note date="2023-05-30" title="minFraud Transactions searchable by email domain" >}} We have updated the minFraud Transactions interface in the account portal to allow users to search for and filter transactions by email domain. [Learn how to search and filter minFraud Transactions through the account portal on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408755037851-Search-the-Log-of-my-minFraud-Transactions) - +{{}} - +{{< release-note date="2023-05-15" title="minFraud Alerts will be restored" >}} We are aware of an issue in which some minFraud Alerts were not being sent or were delayed. @@ -262,9 +262,9 @@ were delayed. We expect to restore full functionality to minFraud Alerts by the end of the day. - +{{}} - +{{< release-note date="2023-03-29" title="Improvements to minFraud Interactive" >}} We have made a number of improvements to the user interface for minFraud Interactive, the interface used to view minFraud transactions through your @@ -276,9 +276,9 @@ now displayed differently. [Learn how to navigate the new interface on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408754902171-View-the-Log-of-my-minFraud-Transactions) - +{{}} - +{{< release-note date="2023-03-21" title="Velocity Checking on User ID" >}} We have enabled velocity tracking on the `account/user_id` input for all minFraud customers. @@ -294,9 +294,9 @@ to identify fraud signals attached to specific users. [Learn more about velocity tracking on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408261402651-Velocity-Checks) - +{{}} - +{{< release-note date="2023-03-16" title="New License Key Format" >}} We have updated the format of our license keys. New license keys will be longer, with a six character prefix. @@ -316,4 +316,4 @@ New license keys will have the following changes: Please note that the length of license keys may be increased in the future. - +{{}} diff --git a/content/minfraud/release-notes/2024.mdx b/content/minfraud/release-notes/2024.md similarity index 89% rename from content/minfraud/release-notes/2024.mdx rename to content/minfraud/release-notes/2024.md index 0e35d563c..edc6cf178 100644 --- a/content/minfraud/release-notes/2024.mdx +++ b/content/minfraud/release-notes/2024.md @@ -7,7 +7,7 @@ title: minFraud Release Notes Subscribe to the [minFraud release notes RSS feed](/minfraud/release-notes/rss.xml). - +{{< release-note date="2024-08-27" title="Introducing Risk Score Reasons beta for minfraud Factors customers" >}} Today, we have released a new beta feature that will help minfraud Factors customers more deeply understand risk patterns and make more informed decisions. @@ -25,9 +25,9 @@ To provide feedback on Risk Score Reasons, please email [customersuccess@maxmind.com](mailto:customersuccess@maxmind.com) to schedule a feedback session. - +{{}} - +{{< release-note date="2024-08-15" title="MaxMind minFraud alert emails now include instant feedback links" >}} MaxMind minFraud alert emails now include links that allow you to provide instant feedback on each request. Providing transaction feedback helps improve @@ -44,9 +44,9 @@ in the minFraud alerts email body. Please continue to [report chargebacks and fraud on your account portal or via API.](https://dev.maxmind.com/minfraud/report-a-transaction) - +{{}} - +{{< release-note date="2024-08-08" title="Additional filtering options now available for minFraud transactions" >}} The transactions screen in your MaxMind account portal now has expanded filtering options, giving you added ability to discover trends in your transactions and adjust risk strategies. @@ -61,9 +61,9 @@ You can now filter transactions by: transaction - **IP Country**: the country for the IP address associated with the transaction - +{{}} - +{{< release-note date="2024-07-09" title="New phone outputs released for minFraud® Insights and minFraud Factors" >}} We have released additional outputs for our [minFraud Insights and minFraud Factors](https://www.maxmind.com/en/solutions/minfraud-services) @@ -114,9 +114,9 @@ Our [client APIs](/minfraud/evaluate-a-transaction#links-to-maxmind-client-apis) have been updated to support these outputs so may need to refresh yours if you are not interfacing directly with our REST API. - +{{}} - +{{< release-note date="2024-04-08" title="Email first seen can be used as a parameter for custom rules" >}} minFraud Insights and Factors customers can now use the [`/email/first_seen` output](https://dev.maxmind.com/minfraud/api-documentation/responses/#schema--response--email) @@ -134,9 +134,9 @@ a custom rule. - [Learn more about setting custom rule conditions on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408362750875#h_01HBNQ01QST1MPM481ZW520R7J) - [Learn more about email risk data on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data) - +{{}} - +{{< release-note date="2024-04-08" title="Upcoming changes to our TLS certificates may impact customers with unusual server configuration" >}} Starting in May, Let's Encrypt will no longer use a cross-signed root certificate, and the primary TLS certificate handling the `*.maxmind.com` @@ -151,9 +151,9 @@ your own local Certificate Authority store. - [Read more about these changes on the Cloudflare blog.](https://blog.cloudflare.com/upcoming-lets-encrypt-certificate-chain-change-and-impact-for-cloudflare-customers) - [Get information about compatibility from Let's Encrypt.](https://letsencrypt.org/docs/certificate-compatibility/) - +{{}} - +{{< release-note date="2024-03-13" title="API policies are now permanently enforced" >}} To improve our server infrastructure and allow for better performance and efficiency, our API policies are now being permanently enforced as of March @@ -184,9 +184,9 @@ using the links below: database download requests. If you are also a GeoIP user, [see our GeoIP release note on this issue](/geoip/release-notes/2024#api-policies-are-now-permanently-enforced). - +{{}} - +{{< release-note date="2024-01-25" title="API policies - temporary enforcement on February 7, 2024" >}} To improve our server infrastructure and allow for better performance and efficiency, MaxMind will begin enforcing our policies around our API and @@ -223,9 +223,9 @@ using the links below: also a GeoIP user, [see our GeoIP release note on this issue](/geoip/release-notes/2024#api-policies---temporary-enforcement-on-february-7-2024). - +{{}} - +{{< release-note date="2024-01-22" title="minFraud no longer accepts event times more than one year in the past" >}} Starting tomorrow, January 23, 2024, minFraud will no longer accept `/event/time` inputs with values more than one year in the past. Most customers @@ -240,4 +240,4 @@ minFraud will: - score the transaction and return a score - return an `INPUT_INVALID` warning with its response - +{{}} From e311e57c988dd7130cf00221be64becd88394db8 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 09:45:42 -0400 Subject: [PATCH 05/24] Add release notes to nav. Update RN new year instructions and redirects --- README.md | 13 +++++-------- hugo.toml | 10 ++++++++++ static/_redirects | 4 ++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index fcfcad837..62c09557d 100644 --- a/README.md +++ b/README.md @@ -109,21 +109,18 @@ PR whose `Firebase - Staging` GitHub workflow has run most recently. Whenever you create your first release note for a product category for a new year: -1. Add a file called `.mdx` to the `/content//release-notes` -folder. (e.g., `/content/geoip/release-notes/2024.mdx`) +1. Add a file called `.md` to the `/content//release-notes` +folder. (e.g., `/content/geoip/release-notes/2024.md`) - Add the header to your new release note file with the title: ` Release Notes` (e.g., `GeoIP2 Release Notes`) and draft to `false`. - Add the RSS notification to the top of the new file. -2. Change the `title:` field in the previous year's `mdx` file to read: ` Release Notes - Archive` +2. Change the `title:` field in the previous year's `md` file to read: ` Release Notes - Archive` (e.g., `GeoIP2 Release Notes - 2023 Archive`) - Remove the RSS notification from the top of the archived file. -3. Update link to the release notes in the navigation menu (`/content/navigation.tsx`) +3. Update link to the release notes in the navigation menu (`hugo.toml`) to point to the current year's pathway. -4. Update the URL in the JS redirects (`/firebase/redirects/release-notes/current-year.js`) +4. Update the URL in the redirects file (`static/_redirects`) to the current year's pathway. -5. Update the URLs used to create RSS feeds (`/src/gatsby/gatsby-config/index.ts`) to -the current year's pathway. -6. Add the newly archived year to the `/src/templates/Page/ReleaseNotesArchiveList.tsx` file. ### Updating Example CSVs diff --git a/hugo.toml b/hugo.toml index 599362808..dc30057ac 100644 --- a/hugo.toml +++ b/hugo.toml @@ -77,6 +77,11 @@ title = 'MaxMind' pageRef = '/minfraud/proxy-detection' parent = 'minFraud' weight = 90 + [[menus.minfraud]] + name = 'Release Notes' + pageRef = '/minfraud/release-notes/2024' + parent = 'minFraud' + weight = 100 [[menus.geoip]] name = 'GeoIP' pageRef = '/geoip' @@ -186,6 +191,11 @@ title = 'MaxMind' pageRef = '/geoip/privacy-exclusions-api' parent = 'GeoIP' weight = 90 + [[menus.geoip]] + name = 'Release Notes' + pageRef = '/geoip/release-notes/2024' + parent = 'GeoIP' + weight = 100 [[menus.general]] name = 'MaxMind Server IP Addresses' diff --git a/static/_redirects b/static/_redirects index 4315584e9..0395445ae 100644 --- a/static/_redirects +++ b/static/_redirects @@ -15,5 +15,5 @@ # The year needs to be hardcoded. A page for the new year's # release note won't exist until a new .md file is created in the # /content//release-notes folder for that new year -/geoip/release-notes /geoip/release-notes/2024 -/minfraud/release-notes /minfraud/release-notes/2024 +/geoip/release-notes /geoip/release-notes/2024 302 +/minfraud/release-notes /minfraud/release-notes/2024 302 From 4a88b8cd806351c0b9be784886d25646634dea79 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 10:02:17 -0400 Subject: [PATCH 06/24] Update RSS feed instructions and add appropriate frontmatter --- README.md | 6 ++---- content/geoip/release-notes/2014.md | 2 ++ content/geoip/release-notes/2015.md | 2 ++ content/geoip/release-notes/2016.md | 2 ++ content/geoip/release-notes/2017.md | 2 ++ content/geoip/release-notes/2018.md | 2 ++ content/geoip/release-notes/2019.md | 2 ++ content/geoip/release-notes/2020.md | 2 ++ content/geoip/release-notes/2021.md | 2 ++ content/geoip/release-notes/2022.md | 2 ++ content/geoip/release-notes/2023.md | 2 ++ content/geoip/release-notes/2024.md | 6 ++++-- content/minfraud/release-notes/2013.md | 2 ++ content/minfraud/release-notes/2014.md | 2 ++ content/minfraud/release-notes/2015.md | 2 ++ content/minfraud/release-notes/2016.md | 2 ++ content/minfraud/release-notes/2017.md | 2 ++ content/minfraud/release-notes/2018.md | 2 ++ content/minfraud/release-notes/2019.md | 2 ++ content/minfraud/release-notes/2020.md | 2 ++ content/minfraud/release-notes/2021.md | 2 ++ content/minfraud/release-notes/2022.md | 2 ++ content/minfraud/release-notes/2023.md | 2 ++ content/minfraud/release-notes/2024.md | 10 ++++++---- static/_redirects | 2 ++ 25 files changed, 56 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 62c09557d..0168e1579 100644 --- a/README.md +++ b/README.md @@ -117,10 +117,8 @@ folder. (e.g., `/content/geoip/release-notes/2024.md`) 2. Change the `title:` field in the previous year's `md` file to read: ` Release Notes - Archive` (e.g., `GeoIP2 Release Notes - 2023 Archive`) - Remove the RSS notification from the top of the archived file. -3. Update link to the release notes in the navigation menu (`hugo.toml`) -to point to the current year's pathway. -4. Update the URL in the redirects file (`static/_redirects`) -to the current year's pathway. +3. Update link to the release notes in the navigation menu (`hugo.toml`) to point to the current year's path. +4. Update the URLs in the redirects file (`static/_redirects`) to the current year's path. ### Updating Example CSVs diff --git a/content/geoip/release-notes/2014.md b/content/geoip/release-notes/2014.md index 53b81f3fb..76d6ebfe8 100644 --- a/content/geoip/release-notes/2014.md +++ b/content/geoip/release-notes/2014.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2014 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2014-12-16" title="More IPs mapped to postal codes" >}} diff --git a/content/geoip/release-notes/2015.md b/content/geoip/release-notes/2015.md index 1c2c3b7fd..3e951c414 100644 --- a/content/geoip/release-notes/2015.md +++ b/content/geoip/release-notes/2015.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2015 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2015-11-17" title="libmaxminddb 1.1.2" >}} diff --git a/content/geoip/release-notes/2016.md b/content/geoip/release-notes/2016.md index 3f723a436..6f7bee944 100644 --- a/content/geoip/release-notes/2016.md +++ b/content/geoip/release-notes/2016.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2016 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2016-11-08" title="Change to Comcast Business ISP name" >}} diff --git a/content/geoip/release-notes/2017.md b/content/geoip/release-notes/2017.md index b8afcaf22..972e6c494 100644 --- a/content/geoip/release-notes/2017.md +++ b/content/geoip/release-notes/2017.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2017 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2017-11-02" title="Anonymizer types added to GeoIP2 Insights" >}} diff --git a/content/geoip/release-notes/2018.md b/content/geoip/release-notes/2018.md index e73bcdef8..872c48e0f 100644 --- a/content/geoip/release-notes/2018.md +++ b/content/geoip/release-notes/2018.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2018 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2018-11-19" title="Initial release of GeoIP2-node" >}} diff --git a/content/geoip/release-notes/2019.md b/content/geoip/release-notes/2019.md index a6623a3b4..9c2f26172 100644 --- a/content/geoip/release-notes/2019.md +++ b/content/geoip/release-notes/2019.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2019 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2019-12-23" title="The USER_ID_REQUIRED error code is now ACCOUNT_ID_REQUIRED" >}} diff --git a/content/geoip/release-notes/2020.md b/content/geoip/release-notes/2020.md index e3e772b8a..ba73fc964 100644 --- a/content/geoip/release-notes/2020.md +++ b/content/geoip/release-notes/2020.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2020 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2020-12-30" title="United Kingdom will no longer be flagged is_in_european_union" >}} diff --git a/content/geoip/release-notes/2021.md b/content/geoip/release-notes/2021.md index cff18cc14..9cd71423d 100644 --- a/content/geoip/release-notes/2021.md +++ b/content/geoip/release-notes/2021.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2021 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2021-12-20" title="GeoNames Monthly Diff Report December 2021" >}} diff --git a/content/geoip/release-notes/2022.md b/content/geoip/release-notes/2022.md index d107cd47f..0be60fa86 100644 --- a/content/geoip/release-notes/2022.md +++ b/content/geoip/release-notes/2022.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2022 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2022-12-19" title="December Holiday Database Release Schedule" >}} diff --git a/content/geoip/release-notes/2023.md b/content/geoip/release-notes/2023.md index b9ac490a0..7ae1a944e 100644 --- a/content/geoip/release-notes/2023.md +++ b/content/geoip/release-notes/2023.md @@ -1,6 +1,8 @@ --- draft: false title: GeoIP2 Release Notes - 2023 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2023-12-12" title="December Holiday Database Release Schedule" >}} diff --git a/content/geoip/release-notes/2024.md b/content/geoip/release-notes/2024.md index 7724e3c63..6a9e3d87a 100644 --- a/content/geoip/release-notes/2024.md +++ b/content/geoip/release-notes/2024.md @@ -1,11 +1,13 @@ --- draft: false title: GeoIP2 Release Notes +type: release-note +outputs: ['html', 'rss'] --- - +{{< alert info >}} Subscribe to the [GeoIP2 release notes RSS feed](/geoip/release-notes/rss.xml). - +{{}} {{< release-note date="2024-09-10" title="GeoNames Monthly Diff Report September 2024" >}} [GeoNames Monthly Diff Report (September 2024)](/csv-files/GeoNames-Monthly-Diff-Report-September-2024.csv) diff --git a/content/minfraud/release-notes/2013.md b/content/minfraud/release-notes/2013.md index e97bd3856..d4b929872 100644 --- a/content/minfraud/release-notes/2013.md +++ b/content/minfraud/release-notes/2013.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2013 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2013-09-17" title="Adding IPv6 access for web endpoints" >}} diff --git a/content/minfraud/release-notes/2014.md b/content/minfraud/release-notes/2014.md index 838685d33..3fc0bfa22 100644 --- a/content/minfraud/release-notes/2014.md +++ b/content/minfraud/release-notes/2014.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2014 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2014-08-04" title="WSDL and Port Change Required for Some minFraud SOAP Users" >}} diff --git a/content/minfraud/release-notes/2015.md b/content/minfraud/release-notes/2015.md index 70be009ed..3d4a56d68 100644 --- a/content/minfraud/release-notes/2015.md +++ b/content/minfraud/release-notes/2015.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2015 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2015-11-30" title="Expanded coverage of prepaid cards" >}} diff --git a/content/minfraud/release-notes/2016.md b/content/minfraud/release-notes/2016.md index 0417768b8..da67aaf93 100644 --- a/content/minfraud/release-notes/2016.md +++ b/content/minfraud/release-notes/2016.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2016 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2016-12-05" title="minFraud's is_postal_in_city available for non-US locations" >}} diff --git a/content/minfraud/release-notes/2017.md b/content/minfraud/release-notes/2017.md index f0bd8c29f..59fbd68d2 100644 --- a/content/minfraud/release-notes/2017.md +++ b/content/minfraud/release-notes/2017.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2017 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2017-11-24" title="Anonymizer types added to minFraud Insights and Factors" >}} diff --git a/content/minfraud/release-notes/2018.md b/content/minfraud/release-notes/2018.md index 71dfd8926..fff6f820d 100644 --- a/content/minfraud/release-notes/2018.md +++ b/content/minfraud/release-notes/2018.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2018 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2018-09-21" title="Changes to US coordinate data" >}} diff --git a/content/minfraud/release-notes/2019.md b/content/minfraud/release-notes/2019.md index f8844b9b3..010a0987f 100644 --- a/content/minfraud/release-notes/2019.md +++ b/content/minfraud/release-notes/2019.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2019 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2019-12-23" title="The USER_ID_REQUIRED error code is now ACCOUNT_ID_REQUIRED" >}} diff --git a/content/minfraud/release-notes/2020.md b/content/minfraud/release-notes/2020.md index 2eeb6f0a3..8e3225515 100644 --- a/content/minfraud/release-notes/2020.md +++ b/content/minfraud/release-notes/2020.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2020 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2020-12-30" title="United Kingdom will no longer be flagged is_in_european_union" >}} diff --git a/content/minfraud/release-notes/2021.md b/content/minfraud/release-notes/2021.md index cbbbff4b5..2bddb2d8e 100644 --- a/content/minfraud/release-notes/2021.md +++ b/content/minfraud/release-notes/2021.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2021 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2021-09-23" title="Update to minimum accuracy_radius value" >}} diff --git a/content/minfraud/release-notes/2022.md b/content/minfraud/release-notes/2022.md index f98c5592e..c27b4d919 100644 --- a/content/minfraud/release-notes/2022.md +++ b/content/minfraud/release-notes/2022.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2022 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2022-10-11" title="MaxMind Sandbox has Launched" >}} diff --git a/content/minfraud/release-notes/2023.md b/content/minfraud/release-notes/2023.md index 2a2c59f09..a9b3f8953 100644 --- a/content/minfraud/release-notes/2023.md +++ b/content/minfraud/release-notes/2023.md @@ -1,6 +1,8 @@ --- draft: false title: minFraud Release Notes - 2023 Archive +type: release-note +outputs: ['html', 'rss'] --- {{< release-note date="2023-12-11" title="Session age input can be used as a parameter for custom rules" >}} diff --git a/content/minfraud/release-notes/2024.md b/content/minfraud/release-notes/2024.md index edc6cf178..a828852d3 100644 --- a/content/minfraud/release-notes/2024.md +++ b/content/minfraud/release-notes/2024.md @@ -1,11 +1,13 @@ --- draft: false title: minFraud Release Notes +type: release-note +outputs: ['html', 'rss'] --- - +{{< alert info >}} Subscribe to the [minFraud release notes RSS feed](/minfraud/release-notes/rss.xml). - +{{}} {{< release-note date="2024-08-27" title="Introducing Risk Score Reasons beta for minfraud Factors customers" >}} @@ -47,8 +49,8 @@ Please continue to {{}} {{< release-note date="2024-08-08" title="Additional filtering options now available for minFraud transactions" >}} -The transactions screen in your MaxMind account portal now has expanded -filtering options, giving you added ability to discover trends in your +The transactions screen in your MaxMind account portal now has expanded +filtering options, giving you added ability to discover trends in your transactions and adjust risk strategies. You can now filter transactions by: diff --git a/static/_redirects b/static/_redirects index 0395445ae..2b639f62c 100644 --- a/static/_redirects +++ b/static/_redirects @@ -16,4 +16,6 @@ # release note won't exist until a new .md file is created in the # /content//release-notes folder for that new year /geoip/release-notes /geoip/release-notes/2024 302 +/geoip/release-notes/rss.xml /geoip/release-notes/2024/index.xml 302 /minfraud/release-notes /minfraud/release-notes/2024 302 +/minfraud/release-notes/rss.xml /minfraud/release-notes/2024/index.xml 302 From e8bc2b32901d39154442b5064db91c386e8028f3 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 10:16:29 -0400 Subject: [PATCH 07/24] Fix release notes active menu styling --- content/geoip/release-notes/2024.md | 4 ++-- hugo.toml | 4 ++-- layouts/partials/sidebar.html | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/content/geoip/release-notes/2024.md b/content/geoip/release-notes/2024.md index 6a9e3d87a..06fbfbcd1 100644 --- a/content/geoip/release-notes/2024.md +++ b/content/geoip/release-notes/2024.md @@ -1,12 +1,12 @@ --- draft: false -title: GeoIP2 Release Notes +title: GeoIP Release Notes type: release-note outputs: ['html', 'rss'] --- {{< alert info >}} -Subscribe to the [GeoIP2 release notes RSS feed](/geoip/release-notes/rss.xml). +Subscribe to the [GeoIP release notes RSS feed](/geoip/release-notes/rss.xml). {{}} {{< release-note date="2024-09-10" title="GeoNames Monthly Diff Report September 2024" >}} diff --git a/hugo.toml b/hugo.toml index dc30057ac..6ebddd5ce 100644 --- a/hugo.toml +++ b/hugo.toml @@ -78,7 +78,7 @@ title = 'MaxMind' parent = 'minFraud' weight = 90 [[menus.minfraud]] - name = 'Release Notes' + name = 'minFraud Release Notes' pageRef = '/minfraud/release-notes/2024' parent = 'minFraud' weight = 100 @@ -192,7 +192,7 @@ title = 'MaxMind' parent = 'GeoIP' weight = 90 [[menus.geoip]] - name = 'Release Notes' + name = 'GeoIP Release Notes' pageRef = '/geoip/release-notes/2024' parent = 'GeoIP' weight = 100 diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html index 01414c306..8c772051c 100644 --- a/layouts/partials/sidebar.html +++ b/layouts/partials/sidebar.html @@ -22,7 +22,7 @@ class="sidebar__child {{ if $currentPage.IsMenuCurrent "minfraud" . }}is-active{{ end }}" href="{{ .URL }}" > - {{ .Name }} + {{ .Name }} {{ if .HasChildren }}
    From a13aca622617ed74eba333d3a3669cc6e3a67538 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 10:22:06 -0400 Subject: [PATCH 08/24] Remove last published footer --- layouts/partials/page.html | 1 - 1 file changed, 1 deletion(-) diff --git a/layouts/partials/page.html b/layouts/partials/page.html index 2deff7bbd..cfc049a7c 100644 --- a/layouts/partials/page.html +++ b/layouts/partials/page.html @@ -5,6 +5,5 @@

    {{ .Title }}

    {{ .Content }} -

    This page was last updated on {{ .Date.Format "January 2, 2006" }}

From 5fc99e6dd93478dd1775b5772a95b45dd4f4cfaa Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 10:47:24 -0400 Subject: [PATCH 09/24] Use render hook to wrap markdown tables --- layouts/_default/_markup/render-table.html | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 layouts/_default/_markup/render-table.html diff --git a/layouts/_default/_markup/render-table.html b/layouts/_default/_markup/render-table.html new file mode 100644 index 000000000..66494da18 --- /dev/null +++ b/layouts/_default/_markup/render-table.html @@ -0,0 +1,31 @@ +
+ + + {{- range .THead }} + + {{- range . }} + + {{- end }} + + {{- end }} + + + {{- range .TBody }} + + {{- range . }} + + {{- end }} + + {{- end }} + +
+ {{- .Text -}} +
+ {{- .Text -}} +
+
From 61d3c5a5446e80e0d586873318eb8fcaf7f26bb7 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 10:50:53 -0400 Subject: [PATCH 10/24] Remove table shortcode --- content/geoip/docs/databases.md | 6 ------ content/geoip/docs/databases/anonymous-ip.md | 2 -- content/geoip/docs/databases/asn.md | 2 -- content/geoip/docs/databases/city-and-country.md | 2 -- content/geoip/docs/databases/connection-type.md | 2 -- content/geoip/docs/databases/domain.md | 2 -- content/geoip/docs/databases/enterprise.md | 2 -- content/geoip/docs/databases/isp.md | 2 -- content/geoip/docs/web-services/requests.md | 4 ---- content/geoip/docs/web-services/responses.md | 6 +----- content/geoip/geolocate-an-ip/client-side-javascript.md | 6 ------ content/geoip/privacy-exclusions-api.md | 6 ------ content/license-key-validation-api.md | 2 -- content/minfraud/alerts.md | 4 ---- content/minfraud/api-documentation/requests.md | 2 -- content/minfraud/minfraud-legacy.md | 2 -- content/minfraud/report-a-transaction.md | 6 ------ content/minfraud/sandbox-environment.md | 4 ---- content/minfraud/working-with-transaction-dispositions.md | 4 ---- layouts/shortcodes/table.html | 3 --- 20 files changed, 1 insertion(+), 68 deletions(-) delete mode 100644 layouts/shortcodes/table.html diff --git a/content/geoip/docs/databases.md b/content/geoip/docs/databases.md index f423de3c4..dcab988cd 100644 --- a/content/geoip/docs/databases.md +++ b/content/geoip/docs/databases.md @@ -44,7 +44,6 @@ title: GeoIP2 and GeoLite2 Database Documentation ### Official Client APIs -{{< table >}} | Language or Framework | Package Repository | Documentation | Version Control | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------- | | .NET (C#) | [NuGet](https://www.nuget.org/packages/MaxMind.GeoIP2/) | [GitHub Pages](https://maxmind.github.io/GeoIP2-dotnet/) | [GitHub](https://github.com/maxmind/GeoIP2-dotnet) | @@ -56,7 +55,6 @@ title: GeoIP2 and GeoLite2 Database Documentation | PHP | [Packagist](https://packagist.org/packages/geoip2/geoip2) | [GitHub Pages](https://maxmind.github.io/GeoIP2-php/) | [GitHub](https://github.com/maxmind/GeoIP2-php) | | Python | [PyPI](https://pypi.python.org/pypi/geoip2) | [Read the Docs](https://geoip2.readthedocs.org/en/latest/) | [GitHub](https://github.com/maxmind/GeoIP2-python) | | Ruby | [RubyGems](https://rubygems.org/gems/maxmind-geoip2) | [RubyDoc](https://www.rubydoc.info/gems/maxmind-geoip2) | [GitHub](https://github.com/maxmind/GeoIP2-ruby) | -{{}} ### Unofficial Client APIs @@ -68,7 +66,6 @@ integrator for assistance. {{}} -{{< table >}} | Language or Software | API Name | Package Repository | Documentation | Version Control | | -------------------- | ------------------------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------ | | C++ | GeoLite2++ | | [Usage](https://www.ccoderun.ca/GeoLite2++/api/usage.html) | | @@ -99,7 +96,6 @@ integrator for assistance. | Rust | maxminddb | [Cargo](https://crates.io/crates/maxminddb) | [API docs](https://oschwald.github.io/maxminddb-rust/maxminddb/struct.Reader.html) | [GitHub](https://github.com/oschwald/maxminddb-rust) | | Scala | maxmind-geoip2-scala | | [README](https://github.com/Sanoma-CDA/maxmind-geoip2-scala/blob/master/README.md) | [GitHub](https://github.com/Sanoma-CDA/maxmind-geoip2-scala) | | Swift (C extension) | MMDB-Swift | [MMDB-Swift](https://cocoapods.org/pods/MMDB-Swift) | [CocoaPods](https://cocoapods.org/pods/MMDB-Swift) | [GitHub](https://github.com/lexrus/MMDB-Swift) | -{{}} ### Integrations @@ -111,7 +107,6 @@ MaxMind does **_not_** offer support for these integrations. Please contact the integrator for assistance. {{}} -{{< table >}} | Application | Platform | Link | | ------------------------------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------- | | Ad-serving | Revive Adserver | [Geotargeting with Revive Adserver](https://www.revive-adserver.com/faq/geotargeting-with-revive-adserver/) | @@ -123,7 +118,6 @@ integrator for assistance. | Log Analyzer / Data Processing | Logstash | [Geoip filter plugin](https://www.elastic.co/guide/en/logstash/current/plugins-filters-geoip.html) | | Network Protocol Analyzer | Wireshark | [How To Use GeoIP With Wireshark](https://gitlab.com/wireshark/wireshark/-/wikis/HowToUseGeoIP) | | Search | Elasticsearch | [GeoIP processor](https://www.elastic.co/guide/en/elasticsearch/reference/current/geoip-processor.html#geoip-processor) | -{{}} ## Command Line (mmdbinspect) diff --git a/content/geoip/docs/databases/anonymous-ip.md b/content/geoip/docs/databases/anonymous-ip.md index d88c98e49..e512b7166 100644 --- a/content/geoip/docs/databases/anonymous-ip.md +++ b/content/geoip/docs/databases/anonymous-ip.md @@ -16,7 +16,6 @@ for assistance. {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [Anonymous IP Example](https://github.com/maxmind/GeoIP2-dotnet#anonymous-ip-database) | @@ -25,7 +24,6 @@ for assistance. | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | [Anonymous IP Example](https://github.com/maxmind/GeoIP2-php#anonymous-ip-example) | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [Anonymous IP Example](https://github.com/maxmind/GeoIP2-python#anonymous-ip-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [Anonymous IP Example](https://github.com/maxmind/GeoIP2-ruby#anonymous-ip-example) | -{{}} ## CSV Database diff --git a/content/geoip/docs/databases/asn.md b/content/geoip/docs/databases/asn.md index d558214c2..07cdf9902 100644 --- a/content/geoip/docs/databases/asn.md +++ b/content/geoip/docs/databases/asn.md @@ -12,7 +12,6 @@ associated with IPv4 and IPv6 addresses. {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [ASN Example](https://github.com/maxmind/GeoIP2-dotnet#asn) | @@ -21,7 +20,6 @@ associated with IPv4 and IPv6 addresses. | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | • | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [ASN Example](https://github.com/maxmind/GeoIP2-python#asn-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [ASN Example](https://github.com/maxmind/GeoIP2-ruby#asn-example) | -{{}} ## CSV Database diff --git a/content/geoip/docs/databases/city-and-country.md b/content/geoip/docs/databases/city-and-country.md index 4ae690964..09eeeba2c 100644 --- a/content/geoip/docs/databases/city-and-country.md +++ b/content/geoip/docs/databases/city-and-country.md @@ -19,7 +19,6 @@ on our product pages: {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [City Example](https://github.com/maxmind/GeoIP2-dotnet#city-database) | @@ -28,7 +27,6 @@ on our product pages: | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | [City Example](https://github.com/maxmind/GeoIP2-php#city-example) | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [City Example](https://github.com/maxmind/GeoIP2-python#city-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [City Example](https://github.com/maxmind/GeoIP2-ruby#city-example) | -{{}} ## CSV Databases diff --git a/content/geoip/docs/databases/connection-type.md b/content/geoip/docs/databases/connection-type.md index 9727f4654..866269d5d 100644 --- a/content/geoip/docs/databases/connection-type.md +++ b/content/geoip/docs/databases/connection-type.md @@ -16,7 +16,6 @@ pricing, please {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [Connection Type Example](https://github.com/maxmind/GeoIP2-dotnet#connection-type-database) | @@ -25,7 +24,6 @@ pricing, please | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | [Connection Type Example](https://github.com/maxmind/GeoIP2-php#connection-type-example) | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [Connection Type Example](https://github.com/maxmind/GeoIP2-python#connection-type-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [Connection Type Example](https://github.com/maxmind/GeoIP2-ruby#connection-type-example) | -{{}} ## CSV Database diff --git a/content/geoip/docs/databases/domain.md b/content/geoip/docs/databases/domain.md index 40296e91f..107e5ab41 100644 --- a/content/geoip/docs/databases/domain.md +++ b/content/geoip/docs/databases/domain.md @@ -15,7 +15,6 @@ please {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [Domain Example](https://github.com/maxmind/GeoIP2-dotnet#domain-database) | @@ -24,7 +23,6 @@ please | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | [Domain Example](https://github.com/maxmind/GeoIP2-php#domain-example) | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [Domain Example](https://github.com/maxmind/GeoIP2-python#domain-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [Domain Example](https://github.com/maxmind/GeoIP2-ruby#domain-example) | -{{}} ## CSV Database diff --git a/content/geoip/docs/databases/enterprise.md b/content/geoip/docs/databases/enterprise.md index a443fbeaf..0bd4769fc 100644 --- a/content/geoip/docs/databases/enterprise.md +++ b/content/geoip/docs/databases/enterprise.md @@ -21,7 +21,6 @@ for assistance. {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [Enterprise Example](https://github.com/maxmind/GeoIP2-dotnet#enterprise-database) | @@ -30,7 +29,6 @@ for assistance. | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | [Enterprise Example](https://github.com/maxmind/GeoIP2-php#enterprise-example) | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [Enterprise Example](https://github.com/maxmind/GeoIP2-python#enterprise-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [Enterprise Example](https://github.com/maxmind/GeoIP2-ruby#enterprise-example) | -{{}} ## CSV Database diff --git a/content/geoip/docs/databases/isp.md b/content/geoip/docs/databases/isp.md index c77064697..2cec1bf84 100644 --- a/content/geoip/docs/databases/isp.md +++ b/content/geoip/docs/databases/isp.md @@ -15,7 +15,6 @@ To learn more about the GeoIP2 ISP database, including terms and pricing, please {{< snippet "snippets/binary-databases.md" >}} -{{< table >}} | Language or Framework | Documentation | Example | | --------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------- | | .NET (C#) | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-dotnet#database-usage) | [ISP Example](https://github.com/maxmind/GeoIP2-dotnet#isp-database) | @@ -24,7 +23,6 @@ To learn more about the GeoIP2 ISP database, including terms and pricing, please | PHP | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-php#database-reader) | [ISP Example](https://github.com/maxmind/GeoIP2-php#isp-example) | | Python | [GitHub - Database Usage](https://github.com/maxmind/GeoIP2-python#database-usage) | [ISP Example](https://github.com/maxmind/GeoIP2-python#isp-database) | | Ruby | [GitHub - Database Reader](https://github.com/maxmind/GeoIP2-ruby#database-reader) | [ISP Example](https://github.com/maxmind/GeoIP2-ruby#isp-example) | -{{}} ## CSV Database diff --git a/content/geoip/docs/web-services/requests.md b/content/geoip/docs/web-services/requests.md index 56e2cacfd..dc922ce3d 100644 --- a/content/geoip/docs/web-services/requests.md +++ b/content/geoip/docs/web-services/requests.md @@ -48,25 +48,21 @@ system making the query is behind a NAT. ### GeoIP Endpoints -{{< table >}} | Service | HTTP Method | Endpoint | | --------- | ----------- | ------------------------------------------------------------ | | Country | `GET` | `https://geoip.maxmind.com/geoip/v2.1/country/{ip_address}` | | City Plus | `GET` | `https://geoip.maxmind.com/geoip/v2.1/city/{ip_address}` | | Insights | `GET` | `https://geoip.maxmind.com/geoip/v2.1/insights/{ip_address}` | -{{}} The `geoip.maxmind.com` hostname automatically picks the data center geographically closest to you. ### GeoLite2 Endpoints -{{< table >}} | Service | HTTP Method | Endpoint | | ------- | ----------- | ------------------------------------------------------ | | Country | `GET` | `https://geolite.info/geoip/v2.1/country/{ip_address}` | | City | `GET` | `https://geolite.info/geoip/v2.1/city/{ip_address}` | -{{}} The `geolite.info` hostname automatically picks the data center geographically closest to you. diff --git a/content/geoip/docs/web-services/responses.md b/content/geoip/docs/web-services/responses.md index 185b67563..433efccd0 100644 --- a/content/geoip/docs/web-services/responses.md +++ b/content/geoip/docs/web-services/responses.md @@ -8,7 +8,6 @@ title: GeoIP and GeoLite API Responses The `Content-Type` for a successful response varies based on the service as outlined below: -{{< table >}} | Service | Content-Type | | ---------------- | ----------------------------------------------------------------------- | | GeoIP Country | `application/vnd.maxmind.com-country+json; charset=UTF-8; version=2.1` | @@ -16,7 +15,6 @@ outlined below: | GeoIP Insights | `application/vnd.maxmind.com-insights+json; charset=UTF-8; version=2.1` | | GeoLite2 Country | `application/vnd.maxmind.com-country+json; charset=UTF-8; version=2.1` | | GeoLite2 City | `application/vnd.maxmind.com-city+json; charset=UTF-8; version=2.1` | -{{}} Errors may be returned with the `Content-Type` set to `application/vnd.maxmind.com-error+json; charset=UTF-8; version=2.0`. If this is @@ -150,7 +148,7 @@ to handle any valid HTTP `4xx` or `5xx` status code.
-{{}} +{{}} ## Response @@ -882,7 +880,6 @@ not have any name data at all for a given object. These names may change between releases. Instead we recommend using one of the following: -{{< table >}} | Data object | Recommended key | | ---------------------------------------------------------- | -------------------------- | | `city` | `geoname_id` | @@ -890,7 +887,6 @@ following: | `country`, `registered_country`, and `represented_country` | `iso_code` or `geoname_id` | | `postal` | `code` | | `subdivisions` | `iso_code` or `geoname_id` | -{{}} ## Example Response Bodies diff --git a/content/geoip/geolocate-an-ip/client-side-javascript.md b/content/geoip/geolocate-an-ip/client-side-javascript.md index 8ecf017a0..702e053c8 100644 --- a/content/geoip/geolocate-an-ip/client-side-javascript.md +++ b/content/geoip/geolocate-an-ip/client-side-javascript.md @@ -51,13 +51,11 @@ requests will fail. The JavaScript client provides 3 public methods: -{{< table >}} | Option | Description | | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `geoip2.country(onSuccess, onError, options)` | Calls the "GeoIP2 Country" endpoint using the routable IP address associated with the machine on which it is running. | | `geoip2.city(onSuccess, onError, options)` | Calls the "GeoIP2 City Plus" endpoint using the routable IP address associated with the machine on which it is running. | | `geoip2.insights(onSuccess, onError, options)` | Calls the "GeoIP2 Insights" endpoint using the routable IP address associated with the machine on which it is running. | -{{}} All of the functions take the same 3 arguments: @@ -189,7 +187,6 @@ All errors are passed in a JavaScript object as the first parameter to the a machine-readable error code that will not change. `error` is a human-readable description of the error. -{{< table >}} | Code | HTTP Status | Description | | ---------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------- | | IP_ADDRESS_INVALID | 400 Bad Request | You have not supplied a valid IPv4 or IPv6 address. | @@ -202,7 +199,6 @@ description of the error. | PERMISSION_REQUIRED | 403 Forbidden | You do not have permission to use the service. Please contact support@maxmind.com for more information. | | HTTP_TIMEOUT | (none) | The request to the GeoIP2 web service timed out. | | HTTP_ERROR | (none) | There was an error making the request to the GeoIP2 web service. | -{{}} ### Versioning @@ -236,7 +232,6 @@ possible, we recommend using the encrypted HTTP (HTTPS) protocol. Here is the list of browsers supported: -{{< table >}} | Browser | Version(s) | | --------------------------- | ----------------------------------------------------------- | | Chrome | Last two stable releases per Chrome Release Stable Channels | @@ -247,7 +242,6 @@ Here is the list of browsers supported: | Opera | Current release | | Android native browser | 5+ | | iOS native browser | 10+ | -{{}} ### Security diff --git a/content/geoip/privacy-exclusions-api.md b/content/geoip/privacy-exclusions-api.md index e31e9206d..0ec0fe3e7 100644 --- a/content/geoip/privacy-exclusions-api.md +++ b/content/geoip/privacy-exclusions-api.md @@ -37,11 +37,9 @@ secure. The query string may include the following parameter: -{{< table >}} | Key | Value Type | Description | | --------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `updates_after` | RFC 3339 timestamp | If set, only updates made after this time will be returned. The value should be a valid [RFC 3339 timestamp](https://tools.ietf.org/html/rfc3339), e.g., `2020-04-12T23:20:50.52Z`. | -{{< /table >}} #### Example Request URL @@ -88,14 +86,12 @@ exclusion request. Each exclusion object in the `exclusions` array includes the following keys: -{{< table >}} | Key | Value Type | Description | | ---------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `exclusion_type` | enum | The governing law or rule that the exclusion was made under. Currently, the only valid type is `ccpa_do_not_sell` for the California Consumer Privacy Act’s “Do Not Sell My Personal Information” provision. | | `data_type` | enum | The data type of the value being excluded. Currently, the only valid data type is `network`, which is an IP network in [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation); all IP addresses in the specified network should be excluded. You should always check this before using the associated `value`. In the future, additional types may be added. | | `value` | string | The value being excluded. | | `last_updated` | RFC 3339 timestamp | The time of the last update to the exclusion as an [RFC 3339 timestamp](https://tools.ietf.org/html/rfc3339). | -{{< /table >}} Please note that additional keys may be added in the future. @@ -117,7 +113,6 @@ and may change at any time. In addition to the errors documented below, client code should also be prepared to handle any valid HTTP 4xx or 5xx status code. -{{< table >}} | Code Error | HTTP Status | Error Mode | | --------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | TIMESTAMP_INVALID | 400 Bad Request | The `updates_after` field must be in [RFC 3339 format](https://tools.ietf.org/html/rfc3339). | @@ -126,7 +121,6 @@ to handle any valid HTTP 4xx or 5xx status code. | LICENSE_KEY_REQUIRED | 401 Unauthorized | An [account ID and license key](https://www.maxmind.com/en/accounts/current/license-key) are required to use this service. | | PERMISSION_REQUIRED | 403 Forbidden | You do not have permission to use the service. Please contact support@maxmind.com for more information. | | _(none)_ | 503 Service Not Available | There is a problem with the web service server. You can [check the status of our services](https://status.maxmind.com), or try this request again later. | -{{< /table >}} #### Example Response (for an unsuccessful request) diff --git a/content/license-key-validation-api.md b/content/license-key-validation-api.md index d7824673a..8f6a59439 100644 --- a/content/license-key-validation-api.md +++ b/content/license-key-validation-api.md @@ -37,11 +37,9 @@ other content types are accepted at the moment. The request body may include the following field: -{{< table >}} | Key | Value Type | Description | | ------------- | ---------- | --------------------------------------------------------------------------------- | | `license_key` | string | The `license_key` field should contain the license key that you want to validate. | -{{}} Here is an example of how to make the request using curl: diff --git a/content/minfraud/alerts.md b/content/minfraud/alerts.md index 82920f577..ab501f2d6 100644 --- a/content/minfraud/alerts.md +++ b/content/minfraud/alerts.md @@ -40,7 +40,6 @@ http://yourdomain/yoururl?i=24.24.24.24&maxmindID=1234ABCD&domain=sample.com&cit The following are the parameters that will be included in the query string of the request. Additional parameters may be added in the future. -{{< table >}} | Parameter | Description | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | `city` | The billing city included in the original minFraud request. | @@ -59,14 +58,12 @@ the request. Additional parameters may be added in the future. | `shop_id` | The shop ID included in the original minFraud request. This will only be set if the original request included a shop ID. | | `txnID` | The transaction ID included in the original minFraud request. | | `updated_at` | The date and time at which the new risk score was calculated, in RFC3339 format, e.g., `2019-11-01T12:34:56Z` | -{{}} #### Possible alert reasons These are the possible `reason_code`s which might be returned with a minFraud Alert. These codes are subject to change. -{{< table >}} | `reason_code` | `reason` | | ------------------ | ------------------------------------------------------------------------------------------------ | | `CARDER_EMAIL` | Email on order was flagged as high-risk email, as it was associated with another high-risk order | @@ -75,7 +72,6 @@ Alert. These codes are subject to change. | `HOSTING_PROVIDER` | IP is from High Risk Hosting Provider | | `MANUAL_REVIEW` | The transaction was flagged as risky after manual review | | `POSTAL_VELOCITY` | IP address had high velocity of orders (e.g. different zipcodes on same IP address) | -{{}} ### Securing your webhook diff --git a/content/minfraud/api-documentation/requests.md b/content/minfraud/api-documentation/requests.md index 5827062fc..d9106f678 100644 --- a/content/minfraud/api-documentation/requests.md +++ b/content/minfraud/api-documentation/requests.md @@ -29,13 +29,11 @@ secure. The endpoint for each service is as specified below. -{{< table >}} | Service | HTTP Method | Endpoint | | -------- | ----------- | ----------------------------------------------------- | | Score | `POST` | `https://minfraud.maxmind.com/minfraud/v2.0/score` | | Insights | `POST` | `https://minfraud.maxmind.com/minfraud/v2.0/insights` | | Factors | `POST` | `https://minfraud.maxmind.com/minfraud/v2.0/factors` | -{{}} The **minfraud.maxmind.com** hostname automatically picks the data center geographically closest to you. diff --git a/content/minfraud/minfraud-legacy.md b/content/minfraud/minfraud-legacy.md index b5b4bc52e..6dce0489e 100644 --- a/content/minfraud/minfraud-legacy.md +++ b/content/minfraud/minfraud-legacy.md @@ -869,13 +869,11 @@ You should receive a minFraud response with risk scores and risk data. The `proxyScore` output will contain a response within the range defined below: -{{< table >}} | Test IP Address Input | Test proxyScore Output Range | | --------------------- | ---------------------------- | | `128.101.101.101` | 2 - 4 | | `74.209.24.1` | 0.5 - 1.99 | | `65.116.3.80` | 0 - 0.49 | -{{}} Here is an example request that should return a valid minFraud response without any warnings or errors, and with a proxyScore between 2 and 4: diff --git a/content/minfraud/report-a-transaction.md b/content/minfraud/report-a-transaction.md index f7a9263ea..71a0e33e3 100644 --- a/content/minfraud/report-a-transaction.md +++ b/content/minfraud/report-a-transaction.md @@ -86,14 +86,12 @@ A transaction report only needs two fields, a transaction identifier, which can be the `ip_address`, the `maxmind_id`, the `minfraud_id`, or the `transaction_id`, and a `tag`. A `tag` can be one of the following values: -{{< table >}} | Tag | Description | | --------------- | ----------------------------------------------------------------------------- | | Chargeback | Used to associate a chargeback with a transaction | | Not fraud | Used to report a transaction that was later identified as a false positive | | Spam or Abuse | Used to report a transaction that was linked to spam or abuse | | Suspected fraud | Used to report a high risk transaction where fraud has not yet been confirmed | -{{}} We highly encourage you to include the MaxMind ID or minFraud ID that identifies the minFraud Standard/Premium request or minFraud Score/Insights/Factors request @@ -296,7 +294,6 @@ The minFraud API accepts input as JSON in the body of an HTTP POST. The JSON document should consist of a single object. That object may contain the following keys (key names are case-sensitive): -{{< table >}} | Name | Type | Description | | ------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ip_address** | string | _Conditionally required.[^1]_ The IP address of the customer placing the order. This should be passed as a string like “44.55.66.77” or “2001:db8::2:1”. | @@ -306,7 +303,6 @@ following keys (key names are case-sensitive): | **minfraud_id** | string (36) | _Conditionally required.[^1]_ A UUID that identifies a minFraud Score, minFraud Insights, or minFraud Factors request. This ID is returned at `/id` in the response. | | **notes** | string | _Optional._ Your notes on the fraud tag associated with the transaction. We manually review many reported transactions to improve our scoring for you so any additional details to help us understand context are helpful. | | **transaction_id** | string | _Conditionally required.[^1]_ The transaction ID you originally passed to minFraud. | -{{}} [^1]: You must provide at least one of `ip_address`, `maxmind_id`, `minfraud_id`, @@ -333,7 +329,6 @@ an error response before attempting to decode the body as JSON. In addition to the errors documented below, client code should also be prepared to handle any valid HTTP 4xx or 5xx status code. -{{< table >}} | Error Code | HTTP Status | Description | | ----------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | JSON_INVALID | 400 Bad Request | Your JSON could not be parsed. | @@ -350,7 +345,6 @@ to handle any valid HTTP 4xx or 5xx status code. | ACCOUNT_ID_REQUIRED | 401 Unauthorized | You have not supplied a [MaxMind account ID](https://support.maxmind.com/hc/en-us/articles/4412951066779-Find-my-Account-ID) in the [Authorization](#authorization-and-security) header. | | (none) | 415 Unsupported Media Type | Your request included a `Content-Type` header that is not supported. For `GET` requests, this means the web service cannot return content of that type. For `PUT` and `POST` queries, this means the web service cannot parse a request body of that type. | | (none) | 503 Service Not Available | There is a problem with the web service server. You can try this request again later. | -{{}} ### Example using curl diff --git a/content/minfraud/sandbox-environment.md b/content/minfraud/sandbox-environment.md index b06d9dac2..8341f1a26 100644 --- a/content/minfraud/sandbox-environment.md +++ b/content/minfraud/sandbox-environment.md @@ -20,13 +20,11 @@ to develop your integration. Use the service endpoints for the Sandbox version of the web services, as listed in the table below: -{{< table >}} | Sandbox Service | HTTP Method | Endpoint | | --------------- | ----------- | ---------------------------------------------------- | | Score | `POST` | `https://sandbox.maxmind.com/minfraud/v2.0/score` | | Insights | `POST` | `https://sandbox.maxmind.com/minfraud/v2.0/insights` | | Factors | `POST` | `https://sandbox.maxmind.com/minfraud/v2.0/factors` | -{{}} Remember to use the license key generated by your Sandbox account to authenticate your requests. @@ -50,13 +48,11 @@ score output ([`/ip_address/risk`](/minfraud/api-documentation/responses#schema--response--ip-address__risk)) will contain a response within the range defined below: -{{< table >}} | Test IP Address Input | Test IP Risk Score Output Range | | --------------------- | ------------------------------- | | `128.101.101.101` | 40 - 99 | | `74.209.24.1` | 5 - 39.99 | | `65.116.3.80` | 0.01 - 4.99 | -{{}} Please note that the Sandbox environment may not return all the risk data that the minFraud service would return, and the risk scores and risk data it does diff --git a/content/minfraud/working-with-transaction-dispositions.md b/content/minfraud/working-with-transaction-dispositions.md index 98f2c9d43..79aff3fe6 100644 --- a/content/minfraud/working-with-transaction-dispositions.md +++ b/content/minfraud/working-with-transaction-dispositions.md @@ -117,7 +117,6 @@ These will be the earliest updated transactions after the provided Each transaction in the updates array will contain the following keys: -{{< table >}} | Key | Value Type | Description | | --------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `minfraud_id` | UUID | The transaction’s unique identifier. | @@ -125,7 +124,6 @@ Each transaction in the updates array will contain the following keys: | `action_last_updated` | Timestamp | The date and time the disposition action was last updated, in RFC 3339 format with microsecond precision. | | `note` | String | The most recent transaction note. Limited to 500 characters. Will be `null` if not currently set. | | `note_last_updated` | Timestamp | The date and time the note was last updated, in RFC 3339 format with microsecond precision. If a note has never been set, this will be `null` | -{{}} As a note to implementers, we are considering adding additional keys to this object in future versions of this API. @@ -209,7 +207,6 @@ the error and may change at any time. In addition to the errors documented below, client code should also be prepared to handle any valid HTTP 4xx or 5xx status code. -{{< table >}} | Code | HTTP Status | Error | | ---------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | UPDATES_AFTER_REQUIRED | 400 Bad Request | You have not supplied the `updates_after` URI parameter. | @@ -222,7 +219,6 @@ to handle any valid HTTP 4xx or 5xx status code. | (none) | 406 Not Acceptable | Your request included an `Accept-Charset` header that is not supported. `UTF-8` is the only acceptable character set. | | (none) | 415 Unsupported Media Type | Your request included an `Accept` header that is not supported. The web service cannot return content of that type. | | (none) | 503 Service Not Available | There is a problem with the web service server. You can try this request again later. | -{{}} ### Example response to an unsuccessful request diff --git a/layouts/shortcodes/table.html b/layouts/shortcodes/table.html deleted file mode 100644 index 7ef87d381..000000000 --- a/layouts/shortcodes/table.html +++ /dev/null @@ -1,3 +0,0 @@ -
- {{ .Inner | markdownify }} -
From b68a8ba35c6207defa45f47bd28a433c935b1f42 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 10:57:14 -0400 Subject: [PATCH 11/24] Add anchor link to headings --- assets/scss/_base.scss | 12 ++++++++---- layouts/_default/_markup/render-heading.html | 3 +++ 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 layouts/_default/_markup/render-heading.html diff --git a/assets/scss/_base.scss b/assets/scss/_base.scss index 006083a58..747948c32 100644 --- a/assets/scss/_base.scss +++ b/assets/scss/_base.scss @@ -28,23 +28,27 @@ h1 { font-weight: 700; } -h2 { +h2, +h2 a { @include mixins.heading; font-size: 24px; font-weight: 700; } -h3 { +h3, +h3 a { @include mixins.heading; font-size: 20px; } -h4 { +h4, +h4 a { @include mixins.heading; font-size: 18px; } -h5 { +h5, +h5 a { @include mixins.heading; font-size: 16px; } diff --git a/layouts/_default/_markup/render-heading.html b/layouts/_default/_markup/render-heading.html new file mode 100644 index 000000000..128dc1579 --- /dev/null +++ b/layouts/_default/_markup/render-heading.html @@ -0,0 +1,3 @@ + + {{ .Text }} + From f3b2bbdf6be9da14441154ecc68e765480e4ec7d Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 11:48:22 -0400 Subject: [PATCH 12/24] Add archive section to release notes --- assets/scss/_page.scss | 16 +++++++++++++++- assets/snippets/minfraud-client-apis.md | 2 -- assets/snippets/returned-values-as-keys.md | 2 -- content/geoip/release-notes/_index.md | 0 content/minfraud/release-notes/_index.md | 0 layouts/partials/page.html | 14 ++++++++++++++ layouts/shortcodes/release-note.html | 2 +- 7 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 content/geoip/release-notes/_index.md create mode 100644 content/minfraud/release-notes/_index.md diff --git a/assets/scss/_page.scss b/assets/scss/_page.scss index 3ba055fa0..aa41a7708 100644 --- a/assets/scss/_page.scss +++ b/assets/scss/_page.scss @@ -39,7 +39,7 @@ .page__title { margin-top: 0; - padding: 0 0 var(--mm-spacing); + padding: 0 0 calc(var(--mm-spacing) / 2); } .page__meta { @@ -49,3 +49,17 @@ margin-top: calc(var(--mm-spacing) * 2); text-align: center; } + +.page__release-note-archive { + border-top: 1px solid var(--mm-color-border); + + ul { + margin-left: 0; + padding-left: 0; + } + + li { + display: inline; + margin-right: calc(var(--mm-spacing) / 3); + } +} diff --git a/assets/snippets/minfraud-client-apis.md b/assets/snippets/minfraud-client-apis.md index 4840303d0..b46a064f6 100644 --- a/assets/snippets/minfraud-client-apis.md +++ b/assets/snippets/minfraud-client-apis.md @@ -2,7 +2,6 @@ The following APIs are developed and maintained by MaxMind. See [our guide on developing for the community](/contribute) if you have questions about creating or sharing your own unofficial clients or integrations. -{{< table >}} | Language or Framework | Package Repository | Documentation | Version Control | | --------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------- | | .NET (C#) | [NuGet](https://www.nuget.org/packages/MaxMind.MinFraud) | [GitHub Pages](https://maxmind.github.io/minfraud-api-dotnet) | [GitHub](https://github.com/maxmind/minfraud-api-dotnet) | @@ -12,4 +11,3 @@ about creating or sharing your own unofficial clients or integrations. | PHP | [Packagist](https://packagist.org/packages/maxmind/minfraud) | [GitHub Pages](https://maxmind.github.io/minfraud-api-php) | [GitHub](https://github.com/maxmind/minfraud-api-php) | | Python | [PyPI](https://pypi.python.org/pypi/minfraud) | [Read the Docs](https://minfraud.readthedocs.io/en/latest/) | [GitHub](https://github.com/maxmind/minfraud-api-python) | | Ruby | [RubyGems.org](https://rubygems.org/gems/minfraud) | [RubyDoc.info](https://www.rubydoc.info/gems/minfraud/) | [GitHub](https://github.com/maxmind/minfraud-api-ruby) | -{{}} diff --git a/assets/snippets/returned-values-as-keys.md b/assets/snippets/returned-values-as-keys.md index 892683503..7ff090108 100644 --- a/assets/snippets/returned-values-as-keys.md +++ b/assets/snippets/returned-values-as-keys.md @@ -4,7 +4,6 @@ in a database or map/dict/hash data structure.** These names may change between releases. Instead we recommend using one of the following: -{{< table >}} | Data object | Recommended key | | ------------ | ---------------------------- | | city | `geoname_id` | @@ -12,4 +11,3 @@ following: | country | `country_iso_code` | | postal | `postal_code` | | subdivisions | `subdivision_{1,2}_iso_code` | -{{}} diff --git a/content/geoip/release-notes/_index.md b/content/geoip/release-notes/_index.md new file mode 100644 index 000000000..e69de29bb diff --git a/content/minfraud/release-notes/_index.md b/content/minfraud/release-notes/_index.md new file mode 100644 index 000000000..e69de29bb diff --git a/layouts/partials/page.html b/layouts/partials/page.html index cfc049a7c..d2a7b3f94 100644 --- a/layouts/partials/page.html +++ b/layouts/partials/page.html @@ -5,5 +5,19 @@

{{ .Title }}

{{ .Content }} + + {{ if eq .Type "release-note" }} +
+

Archive

+
    + {{ range .CurrentSection.RegularPages.ByDate.Reverse }} + {{ $year := path.Base .Path }} + {{ if strings.Contains .Title $year }} +
  • {{ $year }}
  • + {{ end }} + {{ end }} +
+
+ {{ end }}
diff --git a/layouts/shortcodes/release-note.html b/layouts/shortcodes/release-note.html index 31b63a9e0..89ca5fce6 100644 --- a/layouts/shortcodes/release-note.html +++ b/layouts/shortcodes/release-note.html @@ -4,7 +4,7 @@

- {{ $title }} + {{ $title }}

{{ $date | time.Format ":date_long" }} From 639c4c88fff0defd61e214750d0d06d779e87809 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:24:22 -0400 Subject: [PATCH 13/24] Migrate orphan pages --- content/contribute.md | 62 - .../docs/databases/_binary-databases.mdx | 8 - .../docs/databases/_conversion-utility.mdx | 8 - .../docs/databases/_coordinates-warning.mdx | 7 - .../docs/databases/_csv-databases-intro.mdx | 4 - .../docs/databases/_data-privacy-warning.mdx | 10 - .../geoip/docs/databases/_example-files.mdx | 2 - content/geoip/docs/databases/_file-format.mdx | 3 - .../_ip-geolocation-usage-warning.mdx | 8 - .../databases/_returned-values-as-keys.mdx | 13 - .../web-services/_sandbox-geoip-test-data.mdx | 18 - .../docs/web-services/_schemas/Response.mdx | 121 -- .../web-services/_schemas/ResponseCity.mdx | 56 - .../_schemas/ResponseContinent.mdx | 53 - .../web-services/_schemas/ResponseCountry.mdx | 82 -- .../_schemas/ResponseLocation.mdx | 128 --- .../web-services/_schemas/ResponseMaxMind.mdx | 23 - .../web-services/_schemas/ResponsePostal.mdx | 55 - .../_schemas/ResponseRegisteredCountry.mdx | 62 - .../_schemas/ResponseRepresentedCountry.mdx | 70 -- .../_schemas/ResponseSubdivision.mdx | 67 -- .../_schemas/ResponseSubdivisions.mdx | 14 - .../web-services/_schemas/ResponseTraits.mdx | 353 ------ .../docs/web-services/_schemas/index.tsx | 12 - .../web-services/{legacy.mdx => legacy.md} | 1001 +++++++++-------- .../docs/web-services/sandbox-environment.md | 57 + .../docs/web-services/sandbox-environment.mdx | 46 - content/geoip/updating-databases.md | 4 +- ...p-update.mdx => upgrading-geoip-update.md} | 14 +- ...w-in-geoip2.mdx => whats-new-in-geoip2.md} | 0 content/minfraud/_api-clients.mdx | 13 - .../api-documentation/_schemas/Request.mdx | 119 -- .../_schemas/RequestAccount.mdx | 39 - .../_schemas/RequestBilling.mdx | 118 -- .../_schemas/RequestCreditCard.mdx | 155 --- .../_schemas/RequestCustomInputs.mdx | 65 -- .../_schemas/RequestDevice.mdx | 81 -- .../_schemas/RequestEmail.mdx | 43 - .../_schemas/RequestEvent.mdx | 88 -- .../_schemas/RequestOrder.mdx | 115 -- .../_schemas/RequestPayment.mdx | 200 ---- .../_schemas/RequestShipping.mdx | 133 --- .../_schemas/RequestShoppingCart.mdx | 13 - .../_schemas/RequestShoppingCartItem.mdx | 68 -- .../api-documentation/_schemas/Response.mdx | 205 ---- .../_schemas/ResponseBillingAddress.mdx | 88 -- .../_schemas/ResponseBillingPhone.mdx | 36 - .../ResponseCommonAddressProperties.mdx | 71 -- .../_schemas/ResponseCreditCard.mdx | 114 -- .../_schemas/ResponseCreditCardIssuer.mdx | 58 - .../_schemas/ResponseDevice.mdx | 72 -- .../_schemas/ResponseDisposition.mdx | 97 -- .../_schemas/ResponseEmail.mdx | 74 -- .../_schemas/ResponseEmailDomain.mdx | 30 - .../_schemas/ResponseIpAddress.mdx | 85 -- .../_schemas/ResponseIpAddressCountry.mdx | 22 - .../_schemas/ResponseIpAddressLocation.mdx | 26 - .../_schemas/ResponseIpAddressRiskReason.mdx | 95 -- .../_schemas/ResponseIpAddressRiskReasons.mdx | 14 - .../_schemas/ResponseRiskMultiplierReason.mdx | 215 ---- .../_schemas/ResponseRiskReason.mdx | 31 - .../_schemas/ResponseRiskReasons.mdx | 24 - .../_schemas/ResponseShippingAddress.mdx | 115 -- .../_schemas/ResponseShippingPhone.mdx | 36 - .../_schemas/ResponseSubscores.mdx | 338 ------ .../_schemas/ResponseWarning.mdx | 193 ---- .../_schemas/ResponseWarnings.mdx | 12 - .../api-documentation/_schemas/index.mdx | 36 - ...rmalizing-email-addresses-for-minfraud.md} | 0 ...n-minfraud-score-and-minfraud-insights.md} | 4 +- hugo.toml | 10 + 71 files changed, 581 insertions(+), 5131 deletions(-) delete mode 100644 content/contribute.md delete mode 100644 content/geoip/docs/databases/_binary-databases.mdx delete mode 100644 content/geoip/docs/databases/_conversion-utility.mdx delete mode 100644 content/geoip/docs/databases/_coordinates-warning.mdx delete mode 100644 content/geoip/docs/databases/_csv-databases-intro.mdx delete mode 100644 content/geoip/docs/databases/_data-privacy-warning.mdx delete mode 100644 content/geoip/docs/databases/_example-files.mdx delete mode 100644 content/geoip/docs/databases/_file-format.mdx delete mode 100644 content/geoip/docs/databases/_ip-geolocation-usage-warning.mdx delete mode 100644 content/geoip/docs/databases/_returned-values-as-keys.mdx delete mode 100644 content/geoip/docs/web-services/_sandbox-geoip-test-data.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/Response.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseCity.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseContinent.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseCountry.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseLocation.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseMaxMind.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponsePostal.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseRegisteredCountry.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseRepresentedCountry.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseSubdivision.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseSubdivisions.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/ResponseTraits.mdx delete mode 100644 content/geoip/docs/web-services/_schemas/index.tsx rename content/geoip/docs/web-services/{legacy.mdx => legacy.md} (58%) create mode 100644 content/geoip/docs/web-services/sandbox-environment.md delete mode 100644 content/geoip/docs/web-services/sandbox-environment.mdx rename content/geoip/{upgrading-geoip-update.mdx => upgrading-geoip-update.md} (98%) rename content/geoip/{whats-new-in-geoip2.mdx => whats-new-in-geoip2.md} (100%) delete mode 100644 content/minfraud/_api-clients.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/Request.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestAccount.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestBilling.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestCreditCard.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestCustomInputs.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestDevice.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestEmail.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestEvent.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestOrder.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestPayment.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestShipping.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestShoppingCart.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/RequestShoppingCartItem.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/Response.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseBillingAddress.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseBillingPhone.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseCommonAddressProperties.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseCreditCard.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseCreditCardIssuer.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseDevice.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseDisposition.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseEmail.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseEmailDomain.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseIpAddress.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseIpAddressCountry.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseIpAddressLocation.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReason.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReasons.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseRiskMultiplierReason.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseRiskReason.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseRiskReasons.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseShippingAddress.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseShippingPhone.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseSubscores.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseWarning.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/ResponseWarnings.mdx delete mode 100644 content/minfraud/api-documentation/_schemas/index.mdx rename content/minfraud/{normalizing-email-addresses-for-minfraud.mdx => normalizing-email-addresses-for-minfraud.md} (100%) rename content/minfraud/{whats-new-in-minfraud-score-and-minfraud-insights.mdx => whats-new-in-minfraud-score-and-minfraud-insights.md} (97%) diff --git a/content/contribute.md b/content/contribute.md deleted file mode 100644 index 0cf11b2df..000000000 --- a/content/contribute.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -draft: false -title: Contribute to the MaxMind Community ---- - -We welcome the efforts of our community of users to develop robust, unofficial -tools for use with our products and services. One of the reasons that we keep -our APIs open is to encourage development and collaboration as you put our data -to use. - -## Getting Started - -Before you begin developing tools for use across the community, you should fully -familiarize yourself with the relevant official APIs and specifications: - -- [minFraud service REST API](/minfraud/api-documentation/#request-and-response-api-references) -- [GeoIP2 and GeoLite2 service REST API](/geoip/docs/web-services#request-and-response-api-references) -- [GeoIP2 and GeoLite2 MMDB format specification](https://github.com/maxmind/MaxMind-DB/blob/main/MaxMind-DB-spec.md) - -You may also want to look at some of the unofficial APIs that we’ve featured. -While MaxMind does not support or maintain unofficial APIs, you can get a -feeling for the quality of contributions that we feature: - -- [minFraud service Magento 2 Plugin](https://www.weltpixel.com/magento2-maxmind-fraud-prevention-minfraud.html) -- [GeoIP2 and GeoLite2 web services Unofficial APIs](/geoip/docs/web-services/#third-party-client-apis) -- [GeoIP2 and GeoLite2 database Unofficial APIs](/geoip/docs/databases/#unofficial-client-apis) -- [GeoIP2 and GeoLite2 database Integrations (for MMDB format)](/geoip/docs/databases/#integrations) - -You can also peruse our organization and projects on GitHub to get a sense of -how we develop for MaxMind’s products and services. Some good examples to look -at are: - -- [Ruby MMDB Reader](https://github.com/maxmind/MaxMind-DB-Reader-ruby) -- [minFraud .NET API](https://github.com/maxmind/minfraud-api-dotnet) - -## What Tools are Useful to Build - -Well-developed client APIs in languages we don’t already support are especially -useful. We also appreciate efforts to develop plugins for popular content -management systems, as well as analytics and shopping cart software. In order -for your tools to be featured on our developer portal, they must work with one -of our paid products or services (GeoIP2 or minFraud). GeoLite2 databases and -service integrations should be compatible with GeoIP2 products and services with -minor modifications. - -## Sharing Your Tools - -If you would like us to feature an API or tool that you’ve developed for use -with our products and services, please send us an email at support@maxmind.com -with a brief description of the tool and a link to the code and documentation. -We do not guarantee that we will feature all contributions on our site, but -we’re always interested to see what you come up with. - -## Refer Users to MaxMind - -If you develop a useful third-party integration built to use MaxMind data, you -may be interested in referring your users to MaxMind through our Affiliate -Program. - -You can -[learn more about the MaxMind Affiliate Program for developers on our Knowledge Base](https://support.maxmind.com/hc/en-us/sections/5066199198619-Affiliate-Program), -including how to apply. diff --git a/content/geoip/docs/databases/_binary-databases.mdx b/content/geoip/docs/databases/_binary-databases.mdx deleted file mode 100644 index 2577a237b..000000000 --- a/content/geoip/docs/databases/_binary-databases.mdx +++ /dev/null @@ -1,8 +0,0 @@ -Binary databases make use of the -[MaxMind DB file format](https://maxmind.github.io/MaxMind-DB/). MaxMind -provides official client APIs in the language listed below. The following client -APIs are open source and licensed under the Apache License, Version 2.0. - -You can also use the [mmdbinspect tool](https://github.com/maxmind/mmdbinspect) -(in beta), a command line interface built with Go, to look up one or more IPs -from one or more MMDB databases and receive output in a parsable JSON format. diff --git a/content/geoip/docs/databases/_conversion-utility.mdx b/content/geoip/docs/databases/_conversion-utility.mdx deleted file mode 100644 index 5e8a73299..000000000 --- a/content/geoip/docs/databases/_conversion-utility.mdx +++ /dev/null @@ -1,8 +0,0 @@ -We've created a -[small utility program](https://github.com/maxmind/geoip2-csv-converter) to -allow you to convert a GeoIP2 CSV file's representation of IP addresses to -another format. You can choose between start/end IP addresses, with the -addresses represented as strings or integers. - -The program is available from our -[geoip2-csv-converter GitHub project releases tab.](https://github.com/maxmind/geoip2-csv-converter/releases) diff --git a/content/geoip/docs/databases/_coordinates-warning.mdx b/content/geoip/docs/databases/_coordinates-warning.mdx deleted file mode 100644 index 47cf9e112..000000000 --- a/content/geoip/docs/databases/_coordinates-warning.mdx +++ /dev/null @@ -1,7 +0,0 @@ - -*\* The coordinates are not precise and should not be used to identify a -particular street address or household. To better represent a level of -accuracy, please include the `accuracy_radius` when displaying latitude and -longitude and make it clear that the coordinates refer to a larger -geographical area instead of a precise location.* - diff --git a/content/geoip/docs/databases/_csv-databases-intro.mdx b/content/geoip/docs/databases/_csv-databases-intro.mdx deleted file mode 100644 index 3913641c2..000000000 --- a/content/geoip/docs/databases/_csv-databases-intro.mdx +++ /dev/null @@ -1,4 +0,0 @@ -In addition to our MaxMind DB binary format, we also offer GeoIP2 and GeoLite2 -databases in a CSV format suitable for importing into a SQL database. The CSV -files are shipped as a single -[zip file](). diff --git a/content/geoip/docs/databases/_data-privacy-warning.mdx b/content/geoip/docs/databases/_data-privacy-warning.mdx deleted file mode 100644 index 3284dd018..000000000 --- a/content/geoip/docs/databases/_data-privacy-warning.mdx +++ /dev/null @@ -1,10 +0,0 @@ - - **Data Privacy** - -To comply with data privacy regulations, please monitor our -[Do Not Sell My Personal Information Requests](https://www.maxmind.com/en/accounts/current/do-not-sell-requests) -page (login required) for IP addresses and networks that should not be used for -advertising or marketing purposes. You can automate retrieval of this list using -our [privacy exclusions API](/geoip/privacy-exclusions-api). - - diff --git a/content/geoip/docs/databases/_example-files.mdx b/content/geoip/docs/databases/_example-files.mdx deleted file mode 100644 index 8b196045f..000000000 --- a/content/geoip/docs/databases/_example-files.mdx +++ /dev/null @@ -1,2 +0,0 @@ -We maintain example files in CSV and MMDB format. The files contain dummy data -rather than real GeoIP data. diff --git a/content/geoip/docs/databases/_file-format.mdx b/content/geoip/docs/databases/_file-format.mdx deleted file mode 100644 index 2616caa75..000000000 --- a/content/geoip/docs/databases/_file-format.mdx +++ /dev/null @@ -1,3 +0,0 @@ -All the CSV files start with a single header row containing column names. The -specific column names and their contents are detailed below. The files are -encoded as UTF-8. diff --git a/content/geoip/docs/databases/_ip-geolocation-usage-warning.mdx b/content/geoip/docs/databases/_ip-geolocation-usage-warning.mdx deleted file mode 100644 index 18f8bf112..000000000 --- a/content/geoip/docs/databases/_ip-geolocation-usage-warning.mdx +++ /dev/null @@ -1,8 +0,0 @@ - - **IP Geolocation Usage** - -IP geolocation is inherently imprecise. Locations are often near the center of -the population. Any location provided by a GeoIP database should not be used to -identify a particular address or household. - - diff --git a/content/geoip/docs/databases/_returned-values-as-keys.mdx b/content/geoip/docs/databases/_returned-values-as-keys.mdx deleted file mode 100644 index 7ff090108..000000000 --- a/content/geoip/docs/databases/_returned-values-as-keys.mdx +++ /dev/null @@ -1,13 +0,0 @@ -**We strongly discourage you from using a value from any `*_name` field as a key -in a database or map/dict/hash data structure.** - -These names may change between releases. Instead we recommend using one of the -following: - -| Data object | Recommended key | -| ------------ | ---------------------------- | -| city | `geoname_id` | -| continent | `continent_code` | -| country | `country_iso_code` | -| postal | `postal_code` | -| subdivisions | `subdivision_{1,2}_iso_code` | diff --git a/content/geoip/docs/web-services/_sandbox-geoip-test-data.mdx b/content/geoip/docs/web-services/_sandbox-geoip-test-data.mdx deleted file mode 100644 index 3ea1f737b..000000000 --- a/content/geoip/docs/web-services/_sandbox-geoip-test-data.mdx +++ /dev/null @@ -1,18 +0,0 @@ - -The Sandbox will return geolocation and IP intelligence data, but this data is -not accurate and should not be used to evaluate the efficacy of the minFraud -scoring engine, or for geolocation or IP intelligence. It is designed for -testing purposes only. - - -There are a limited number of IP addresses in the test database for the GeoIP -web services on the Sandbox. The Sandbox versions of the GeoIP web services use -[special test data that is published to GitHub](https://github.com/maxmind/MaxMind-DB/blob/main/source-data/). - -If you attempt to submit an IP address that doesn't exist in the test data, you -will receive an error stating that the IP address does not exist in our -database. - -The test data is displayed in JSON format, and would be the expected response -for a query using the listed IP address. -[Learn more about working with our GeoIP test data on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/8610782760731-Sandbox-for-the-GeoIP-Web-Services#h_01GC7FJGRWC116ZCDPAJP09V9M) diff --git a/content/geoip/docs/web-services/_schemas/Response.mdx b/content/geoip/docs/web-services/_schemas/Response.mdx deleted file mode 100644 index 853ddd2c3..000000000 --- a/content/geoip/docs/web-services/_schemas/Response.mdx +++ /dev/null @@ -1,121 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - All services return data as a JSON document. The document that is returned - always consists of an object (aka map or hash). Each key in the object in turn - maps to an object or an array of objects. - -The exact set of top-level keys varies based on the particular GeoIP2 web -service you are using. If a key maps to an undefined or empty value, it is not -included in the JSON object. This applies both to top-level keys and the objects -they map to. - -The data returned in the document will be in UTF-8 encoding. - - - A JSON object containing details about the city associated with the IP - address. - - - - A JSON object containing information about the continent associated with the - IP address. - - - - A JSON object containing details about the country where MaxMind believes - the end user is located. - - - - A JSON object containing specific details about the location associated with - the IP address. - - - - A JSON object containing details about the postal code associated with the - IP address. - - - - A JSON object containing details about the country in which the ISP has - registered the IP address. - - - - A JSON object containing details about the country which is represented by - users of the IP address. For instance, the country represented by an - overseas military base. - - - - An array of JSON objects. Each of these objects contains details about a - subdivision of the country in which the IP address resides. Subdivisions are - arranged from largest to smallest. - - For instance, the response for Oxford in the United Kingdom would have an - object for England as the first element in `subdivisions` array and an - object for Oxfordshire as the second element. The `subdivisions` array for - Minneapolis in the United States will have a single object for Minnesota. - - - - - A JSON object containing general traits associated with the IP address. - - - - A JSON object containing information related to your MaxMind account. - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseCity.mdx b/content/geoip/docs/web-services/_schemas/ResponseCity.mdx deleted file mode 100644 index bff954104..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseCity.mdx +++ /dev/null @@ -1,56 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing details about the city associated with the IP - address. - - - A value from 0-100 representing our confidence that the city is correct. - - [Learn more about confidence factors on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZ767N9MJJ21K9CW04WWQ) - - - - - A unique identifier for the city as specified by - [GeoNames](https://www.geonames.org/). - - [Learn more about GeoNames IDs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRNFD5Z5EWNCAXM6SZZ5H2C) - - - - - A map from locale codes, such as `en`, to the localized names for the - feature. - - [Learn more about localized geolocation names on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRGRYTGZB29ERDBZCX3MR8Q) - - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseContinent.mdx b/content/geoip/docs/web-services/_schemas/ResponseContinent.mdx deleted file mode 100644 index 288ec2e55..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseContinent.mdx +++ /dev/null @@ -1,53 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing information about the continent associated with the - IP address. - - - A two-character code for the continent associated with the IP address. The - possible codes are: - - * `AF` – Africa - * `AN` – Antarctica - * `AS` – Asia - * `EU` – Europe - * `NA` – North America - * `OC` – Oceania - * `SA` – South America - - [Learn more about continent codes on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRJSP2B14KSWWJTXKRWZGKJ) - - - - - A unique identifier for the continent as specified by - [GeoNames](https://www.geonames.org/). - - [Learn more about GeoNames IDs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRNFD5Z5EWNCAXM6SZZ5H2C) - - - - - A map from locale codes, such as `en`, to the localized names for the - feature. - - [Learn more about localized geolocation names on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRGRYTGZB29ERDBZCX3MR8Q) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseCountry.mdx b/content/geoip/docs/web-services/_schemas/ResponseCountry.mdx deleted file mode 100644 index 1f7a8043e..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseCountry.mdx +++ /dev/null @@ -1,82 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing details about the country where MaxMind believes the - end user is located. - - - A unique identifier for the country as specified by - [GeoNames](https://www.geonames.org/). - - [Learn more about GeoNames IDs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRNFD5Z5EWNCAXM6SZZ5H2C) - - - - - A value from 0-100 representing our confidence that the country is correct. - - [Learn more about confidence factors on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZ767N9MJJ21K9CW04WWQ) - - - - - This is `true` if the country is a member state of the European Union. - Otherwise, the key is not included in the `country` object. - - [Learn more about the European Union flag on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRMQN1B2WWTDM8HSQ20870M) - - - - - A two-character [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) - country code for the country associated with the IP address. - - [Learn more about country codes on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRJSP2B14KSWWJTXKRWZGKJ) - - - - - A map from locale codes, such as `en`, to the localized names for the - feature. - - [Learn more about localized geolocation names on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRGRYTGZB29ERDBZCX3MR8Q) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseLocation.mdx b/content/geoip/docs/web-services/_schemas/ResponseLocation.mdx deleted file mode 100644 index 1e08132b1..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseLocation.mdx +++ /dev/null @@ -1,128 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing specific details about the location associated with - the IP address. - - - The approximate accuracy radius, in kilometers, around the latitude and - longitude for the geographical entity (country, subdivision, city or postal - code) associated with the IP address. We have a 67% confidence that the - location of the end-user falls within the area defined by the accuracy - radius and the latitude and longitude coordinates. - - [Learn about the geolocation area defined by latitude, longitude, and - accuracy radius, on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZZP6RAYSNZTYE4MQ3MWY) - - - - - The average annual income associated with the IP address in US dollars. This - is only available for IP addresses in the US. - - [Learn more about average income data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208479131-User-Context-Data#h_01FN9BTX4DQGT8W7JBX60A7PM5) - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - latitude of the postal code, city, subdivision or country associated with - the IP address. - - - **IP Geolocation Usage** - - The coordinates are not precise and should not be used to identify a - particular street address or household. To better represent a level of - accuracy, please include the `accuracy_radius` when displaying latitude and - longitude and make it clear that the coordinates refer to a larger - geographical area instead of a precise location. - - - [Learn about the geolocation area defined by latitude, longitude, and - accuracy radius, on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZZP6RAYSNZTYE4MQ3MWY) - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - longitude of the postal code, city, subdivision or country associated with - the IP address. - - - **IP Geolocation Usage** - - The coordinates are not precise and should not be used to identify a - particular street address or household. To better represent a level of - accuracy, please include the `accuracy_radius` when displaying latitude and - longitude and make it clear that the coordinates refer to a larger - geographical area instead of a precise location. - - - [Learn about the geolocation area defined by latitude, longitude, and - accuracy radius, on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZZP6RAYSNZTYE4MQ3MWY) - - - - - Metro code is a geolocation target code from Google. - - - - The estimated number of people per square kilometer. This is only available - for IP addresses in the US. - - [Learn more about population density data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208479131-User-Context-Data#h_01FN9BTX4DQGT8W7JBX60A7PM5) - - - - - The time zone associated with location, as specified by the - [IANA Time Zone Database](https://www.iana.org/time-zones), e.g., - "America/New_York". - - [Learn more about time zone data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRKYHGB5C5Y1G4Y3AW18PYC) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseMaxMind.mdx b/content/geoip/docs/web-services/_schemas/ResponseMaxMind.mdx deleted file mode 100644 index eb56ae465..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseMaxMind.mdx +++ /dev/null @@ -1,23 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing information related to your MaxMind account. - - - The approximate number of remaining queries available for the end point - which is being called. - - - This field is not present in the GeoLite2 City web service. - - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponsePostal.mdx b/content/geoip/docs/web-services/_schemas/ResponsePostal.mdx deleted file mode 100644 index da2bcf68f..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponsePostal.mdx +++ /dev/null @@ -1,55 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing details about the postal code associated with the IP - address. - - - A postal code close to the user’s location. For the following countries, we - return partial postal codes with the number of characters indicated below: - - * United States: 5 - * Canada: 3 - * United Kingdom: 2-4 - * Brazil: 5 - * Ireland: 3 - * Japan: 7 (specified for the first 6. The last digit defaults to 1) - * Netherlands: 4 - * Portugal: 7 (accurate for the first 4. The last 3 often defaults to - `-001`) - * Singapore: 2 - - [Learn more about postal code data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRJSP2B14KSWWJTXKRWZGKJ) - - - - - A value from 0-100 representing our confidence that the postal code is - correct. - - [Learn more about confidence factors on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZ767N9MJJ21K9CW04WWQ) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseRegisteredCountry.mdx b/content/geoip/docs/web-services/_schemas/ResponseRegisteredCountry.mdx deleted file mode 100644 index 6913e391b..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseRegisteredCountry.mdx +++ /dev/null @@ -1,62 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing details about the country in which the ISP has - registered the IP address. - -[Learn about registered countries on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414762983195-Country-level-and-City-level-Geolocation) - - - A unique identifier for the country as specified by - [GeoNames](https://www.geonames.org/). - - [Learn more about GeoNames IDs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRNFD5Z5EWNCAXM6SZZ5H2C) - - - - - This is `true` if the registered country is a member state of the European - Union. Otherwise, the key is not included in the `registered_country` - object. - - [Learn more about the European Union flag on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRMQN1B2WWTDM8HSQ20870M) - - - - - A two-character [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) - country code for the registered country. - - [Learn more about ISO code data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRJSP2B14KSWWJTXKRWZGKJ) - - - - - A map from locale codes, such as `en`, to the localized names for the - feature. - - [Learn more about localized geolocation names on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRGRYTGZB29ERDBZCX3MR8Q) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseRepresentedCountry.mdx b/content/geoip/docs/web-services/_schemas/ResponseRepresentedCountry.mdx deleted file mode 100644 index dcc52628d..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseRepresentedCountry.mdx +++ /dev/null @@ -1,70 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing details about the country which is represented by - users of the IP address. For instance, the country represented by an overseas - military base. - -[Learn about represented countries on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4414762983195-Country-level-and-City-level-Geolocation) - - - A unique identifier for the country as specified by - [GeoNames](https://www.geonames.org/). - - [Learn more about GeoNames IDs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRNFD5Z5EWNCAXM6SZZ5H2C) - - - - - This is `true` if the registered country is a member state of the European - Union. Otherwise, the key is not included in the `represented_country` - object. - - [Learn more about the European Union flag on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRMQN1B2WWTDM8HSQ20870M) - - - - - A two-character [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) - country code for the represented_country country. - - [Learn more about ISO code data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRJSP2B14KSWWJTXKRWZGKJ) - - - - - A map from locale codes, such as `en`, to the localized names for the - feature. - - - - The type of represented country. Currently limited to `military`, but may - include other types in the future. - - [Learn more about localized geolocation names on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRGRYTGZB29ERDBZCX3MR8Q) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseSubdivision.mdx b/content/geoip/docs/web-services/_schemas/ResponseSubdivision.mdx deleted file mode 100644 index 4f4c1ede9..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseSubdivision.mdx +++ /dev/null @@ -1,67 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing details about a subdivision of the country in which - the IP address resides. - - - A value from 0-100 representing our confidence that the region is correct. - - [Learn more about confidence factors on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRHZ767N9MJJ21K9CW04WWQ) - - - - - A unique identifier for the region as specified by - [GeoNames](https://www.geonames.org/). - - [Learn more about GeoNames IDs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRNFD5Z5EWNCAXM6SZZ5H2C) - - - - - A string of up to three characters containing the region-portion of the - [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code for the region - associated with the IP address. - - [Learn more about ISO code data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRJSP2B14KSWWJTXKRWZGKJ) - - - - - A map from locale codes, such as `en`, to the localized names for the - feature. - - [Learn more about localized geolocation names on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4414877149467-IP-Geolocation-Data#h_01FRRGRYTGZB29ERDBZCX3MR8Q) - - - diff --git a/content/geoip/docs/web-services/_schemas/ResponseSubdivisions.mdx b/content/geoip/docs/web-services/_schemas/ResponseSubdivisions.mdx deleted file mode 100644 index 6c9dacc22..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseSubdivisions.mdx +++ /dev/null @@ -1,14 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - An array of [subdivision](#schema--response--subdivision) JSON objects. - Subdivisions are arranged from largest to smallest. - diff --git a/content/geoip/docs/web-services/_schemas/ResponseTraits.mdx b/content/geoip/docs/web-services/_schemas/ResponseTraits.mdx deleted file mode 100644 index 591123c02..000000000 --- a/content/geoip/docs/web-services/_schemas/ResponseTraits.mdx +++ /dev/null @@ -1,353 +0,0 @@ -import responseJson from '../_examples/geoip'; - - - A JSON object containing general traits associated with the IP address. - - - The [autonomous system number](https://en.wikipedia.org/wiki/Autonomous_system_(Internet)) - associated with the IP address. - - [Learn more about autonomous system data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FN989WWSE56YD6AV4QSPSWDW) - - - - - The organization associated with the registered - [autonomous system number](https://en.wikipedia.org/wiki/Autonomous_system_(Internet)) - for the IP address. - - [Learn more about autonomous system data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FN989WWSE56YD6AV4QSPSWDW) - - - - - One of the following values: `Cable/DSL`, `Cellular`, `Corporate`, or - `Satellite`. Additional values may be added in the future. - - - This field is not present in the GeoLite2 City web service. - - - [Learn more about connection type data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FN988THBX8RVERNTZ12BY2EC) - - - - - The second level domain associated with the IP address. This will be - something like “example.com” or “example.co.uk”, not “foo.example.com”. - - - This field is not present in the GeoLite2 City web service. - - - [Learn more about domain name data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FN98A5BNTS0GGWTD2QA4AHXN) - - - - - The requested IP address. - - - - This is `true` if the IP address belongs to any sort of anonymous network. - Otherwise, the key is not included in the `traits` object. - - [Learn more about anonymizer and proxy detection on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208507163-Anonymizer-and-Proxy-Data#h_01FN9BBGV3ZG3TC0357Q9Y07C6) - - - - - Consider using one of our anonymizer service outputs, such as `is_anonymous` - and `is_anonymous_vpn`. These anonymizing service outputs are available in - the [GeoIP2 Anonymous IP database](https://www.maxmind.com/en/geoip2-anonymous-ip-database) - and the [GeoIP2 Insights web services](https://www.maxmind.com/en/geoip2-precision-insights). - - - - This is `true` if the IP address is registered to an anonymous VPN provider. - Otherwise, the key is not included in the `traits` object. - - If a VPN provider does not register subnets under names associated with - them, we will likely only flag their IP ranges using the - `is_hosting_provider` flag. - - [Learn more about VPNs on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208507163#h_01G1EDVJKNQY02XXFRM31N7SS2) - - - - - This is `true` if the IP address belongs to an [anycast network](https://en.wikipedia.org/wiki/Anycast). - - - - - This is `true` if the IP address belongs to a hosting or VPN provider - (see description of `is_anonymous_vpn` flag). Otherwise, the key is not - included in the `traits` object. - - [Learn more about hosting providers used for anonymizing on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208507163#h_01G1EDVXR9RQFMCY6SAWJM4YH0) - - - - - This is `true` if the IP address belongs to a public proxy. Otherwise, the - key is not included in the `traits` object. - - [Learn more about public proxies on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208507163#h_01G1EDW5RZQCD4X4A76908DJ6Z) - - - - - This is `true` if the IP address is on a suspected anonymizing network and - belongs to a residential ISP (does not include peer-to-peer proxy IPs). - Otherwise, the key is not included in the `traits` object. - - [Learn more about residential proxies on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208507163#h_01G1EDWEW3HAJT97P8EAZFQZMZ) - - - - - - - This is `true` if the IP address is a Tor exit node. Otherwise, the key is - not included in the `traits` object. - - [Learn more about Tor exit nodes on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208507163#h_01G1EDWR1VQR8A0NB3R8WXT8QF) - - - - - The name of the ISP associated with the IP address. - - - This field is not present in the GeoLite2 City web service. - - - [Learn more about ISP data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FN989KHXR7TGXPB5T2DK0Q77) - - - - - The [mobile country code (MCC)](https://en.wikipedia.org/wiki/Mobile_country_code) associated with the IP address and ISP. - - - This field is not present in the GeoLite2 City web service. - - - [Learn more about mobile country code data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FT6Y6ANRH9GWYXE78B4RXAEX) - - - - - The [mobile network code (MNC)](https://en.wikipedia.org/wiki/Mobile_country_code) associated with the IP address and ISP. - - - This field is not present in the GeoLite2 City web service. - - - [Learn more about mobile network code data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FT6Y6ANRH9GWYXE78B4RXAEX) - - - - - The network in [CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation) - associated with the record. In particular, this is the largest network where - all of the fields besides `ip_address` have the same value. - - - - The name of the organization associated with the IP address. - - - This field is not present in the GeoLite2 City web service. - - - [Learn more about organization data on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408200231067-IP-Network-Data#h_01FN989KHXR7TGXPB5T2DK0Q77) - - - - - An indicator of how static or dynamic an IP address is. The value ranges - from 0 to 99.99 with higher values meaning a greater static association. For - example, many IP addresses with a `user_type` of `cellular` have a score - under one. Broadband IPs that don’t change very often typically have a score - above thirty. - - This indicator can be useful for deciding whether an IP address represents - the same user over time. - - [Learn more about the static IP score on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208479131-User-Context-Data#h_01FN9BSX7X351J8PV0WCH0E88F) - - - - - The estimated number of users sharing the IP/network during the past 24 - hours. For IPv4, the count is for the individual IP. For IPv6, the count - is for the /64 network. - - [Learn more about the user count on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208479131-User-Context-Data#h_01FN9BT5PC591YRNBFZGHDYNS6) - - - - - The user type associated with the IP address. This will be one of the - following values: - - * `business` - * `cafe` - * `cellular` - * `college` - * `consumer_privacy_network` - * `content_delivery_network` - * `government` - * `hosting` - * `library` - * `military` - * `residential` - * `router` - * `school` - * `search_engine_spider` - * `traveler` - - [Learn more about the user type on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408208479131-User-Context-Data#h_01FN9BTGFQVP41YNPDGM454T2T) - - - diff --git a/content/geoip/docs/web-services/_schemas/index.tsx b/content/geoip/docs/web-services/_schemas/index.tsx deleted file mode 100644 index e844ded08..000000000 --- a/content/geoip/docs/web-services/_schemas/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export { default as Response } from './Response.mdx'; -export { default as ResponseCity } from './ResponseCity.mdx'; -export { default as ResponseContinent } from './ResponseContinent.mdx'; -export { default as ResponseCountry } from './ResponseCountry.mdx'; -export { default as ResponseLocation } from './ResponseLocation.mdx'; -export { default as ResponsePostal } from './ResponsePostal.mdx'; -export { default as ResponseRegisteredCountry } from './ResponseRegisteredCountry.mdx'; -export { default as ResponseRepresentedCountry } from './ResponseRepresentedCountry.mdx'; -export { default as ResponseSubdivision } from './ResponseSubdivision.mdx'; -export { default as ResponseSubdivisions } from './ResponseSubdivisions.mdx'; -export { default as ResponseTraits } from './ResponseTraits.mdx'; -export { default as ResponseMaxMind } from './ResponseMaxMind.mdx'; diff --git a/content/geoip/docs/web-services/legacy.mdx b/content/geoip/docs/web-services/legacy.md similarity index 58% rename from content/geoip/docs/web-services/legacy.mdx rename to content/geoip/docs/web-services/legacy.md index dcf53cda1..ebc52bc81 100644 --- a/content/geoip/docs/web-services/legacy.mdx +++ b/content/geoip/docs/web-services/legacy.md @@ -3,20 +3,19 @@ draft: false title: GeoIP Legacy Web Services --- -import { FaCheck } from 'react-icons/fa'; - +{{< alert info >}} We have implemented recent changes to our GeoIP Legacy web services in line with the retirement of GeoIP Legacy Databases. Please see our [blog post](https://blog.maxmind.com/2020/06/data-changes-to-geoip-legacy-and-minfraud-legacy-web-services-in-may-2022/) for more information. - +{{}} - +{{< alert warning >}} **Note:** This documentation is for the GeoIP legacy services. New customers do not have access to these services. Please use the [GeoIP2 web services](/geoip/docs/web-services). - +{{}} The GeoIP web services allow you to look up information about a given IP address using an HTTP-based API. @@ -87,413 +86,417 @@ All strings are returned in the [ISO-8859-1 encoding](https://en.wikipedia.org/wiki/ISO/IEC_8859-1). This encoding is also referred to as latin1. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Included in …
NameType (length)DescriptionCountry?City?City/ISP/Org?Insights (formerly Omni)?
Accuracy radiusinteger - The radius in kilometers around the specified location where the IP address is -likely to be. -
City namestring - The city or town name as defined by GeoNames associated with the IP address. -
Region codestring -

- The ISO-3166-2 code for - the state/region associated with the IP address. -

- -

- We previously returned a FIPS 10-4 code for all countries other than the United States and Canada. See our blog post detailing changes to our legacy web services. -

-
Region namestring - The region name as defined by GeoNames associated with the IP address. -
Postal codestring - The postal code associated with the IP address. These are available for some IP -addresses in Australia, Canada, France, Germany, Italy, Spain, Switzerland, -United Kingdom, and the US. We return the first 3 characters for Canadian -postal codes. We return the first 2-4 characters (outward code) for -postal codes in the United Kingdom. -
Metro codeinteger - The metro code associated with the IP address. These are only - available for IP addresses in the US. -
Area codestring -

Deprecated. This field will be empty in the updated legacy web service. See our blog post detailing changes to our legacy web services.

Country codestring (2) -

- A ISO - 3166-1 country code for the country associated with the IP address. In - addition to the standard codes, we may also return one of the following: -

- -
    -
  • - A1 – an anonymous proxy. -
  • -
  • - A2 – a satellite provider. -
  • -
  • - EU – an IP in a block used by - multiple European countries. -
  • -
  • - AP – an IP in a block used by - multiple Asia/Pacific region countries. -
  • -
- -

- The US country code is returned for IP addresses associated - with overseas US military bases. -

- -
Country namestring - The country name as defined by GeoNames associated with the IP address. - -
Continent codestring (2) -

- A two-character code for the continent associated with the IP - address. The possible codes are: -

- -
    -
  • AF – Africa
  • -
  • AN – Antarctica
  • -
  • AS – Asia
  • -
  • EU – Europe
  • -
  • NA – North America
  • -
  • OC – Oceania
  • -
  • SA – South America
  • -
-
Latitudedecimal - The approximate latitude of the location associated with the network. This value is not precise and should not be used to identify a particular address or household -
Longitudedecimal - The approximate longitude of the location associated with the network. Latitude and Longitude are often near the center of population. These values are not precise and should not be used to identify a particular address or household. -
Time zonestring - The time zone associated with the IP address. Time zone names are taken from -the IANA time zone database. See -the list of possible values. - -
AS numberstring - The autonomous system number associated with the IP address. -
User typeenum -

- -The user type associated with the IP address. This will be one of the following -values. - -

- -
    -
  • business
  • -
  • cafe
  • -
  • cellular
  • -
  • college
  • -
  • contentDeliveryNetwork
  • -
  • government
  • -
  • hosting
  • -
  • library
  • -
  • military
  • -
  • residential
  • -
  • router
  • -
  • school
  • -
  • searchEngineSpider
  • -
  • traveler
  • -
- -
Netspeedenum -

- -The network speed associated with the IP address. This can be one of the -following values: - -

- -
    -
  • Dialup
  • -
  • Cable/DSL
  • -
  • Corporate
  • -
  • Cellular
  • -
- -
Domainstring - The second level domain associated with the IP address. This will be - -something like "example.com" or "example.co.uk", not "foo.example.com". - -
ISP namestring - The name of the ISP associated with the IP address. - -
Organization namestring - The name of the organization associated with the IP address. - -
City confidence factorstring - A value from 0-100 representing our confidence that the city is correct. - -
Region confidence factorstring - A value from 0-100 representing our confidence that the region is correct. - -
Postal confidence factorstring - A value from 0-100 representing our confidence that the postal code is correct. - -
Country confidence factorstring - A value from 0-100 representing our confidence that the country is correct. - -
Error codestring -

- If there was an error or warning with this request, this field - contains an error code string. -

- -

- The possible error codes are: -

- -
    -
  • PERMISSION_REQUIRED – This is returned if you do not have permission to use the service. Please contact support@maxmind.com for more information.
  • -
  • - INVALID_LICENSE_KEY – This error will be returned - when the license key you pass is not a valid license key or when your account has run out of queries. -
  • -
  • LICENSE_REQUIRED – The Insight service returns this instead of INVALID_LICENSE_KEY.
  • -
  • - IP_NOT_FOUND – This error will be returned if the - IP address it not valid, if it is not public, or if it is not in - our GeoIP database. It will also be returned if you do not pass an - IP address at all. -
  • -
-
+{{< rawhtml >}} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Included in …
NameType (length)DescriptionCountry?City?City/ISP/Org?Insights (formerly Omni)?
Accuracy radiusinteger + The radius in kilometers around the specified location where the IP address is + likely to be. + YES
City namestring + The city or town name as defined by GeoNames associated with the IP address. + YESYESYES
Region codestring +

+ The ISO-3166-2 code for + the state/region associated with the IP address. +

+ +

+ We previously returned a FIPS 10-4 code for all countries other than the United States and Canada. See our blog post detailing changes to our legacy web services. +

+
YESYESYES
Region namestring + The region name as defined by GeoNames associated with the IP address. + YES
Postal codestring + The postal code associated with the IP address. These are available for some IP + addresses in Australia, Canada, France, Germany, Italy, Spain, Switzerland, + United Kingdom, and the US. We return the first 3 characters for Canadian + postal codes. We return the first 2-4 characters (outward code) for + postal codes in the United Kingdom. + YESYES
Metro codeinteger + The metro code associated with the IP address. These are only + available for IP addresses in the US. + YESYES
Area codestring +

Deprecated. This field will be empty in the updated legacy web service. See our blog post detailing changes to our legacy web services.

YESYES
Country codestring (2) +

+ A ISO + 3166-1 country code for the country associated with the IP address. In + addition to the standard codes, we may also return one of the following: +

+ +
    +
  • + A1 – an anonymous proxy. +
  • +
  • + A2 – a satellite provider. +
  • +
  • + EU – an IP in a block used by + multiple European countries. +
  • +
  • + AP – an IP in a block used by + multiple Asia/Pacific region countries. +
  • +
+ +

+ The US country code is returned for IP addresses associated + with overseas US military bases. +

+ +
YESYESYESYES
Country namestring + The country name as defined by GeoNames associated with the IP address. + + YES
Continent codestring (2) +

+ A two-character code for the continent associated with the IP + address. The possible codes are: +

+ +
    +
  • AF – Africa
  • +
  • AN – Antarctica
  • +
  • AS – Asia
  • +
  • EU – Europe
  • +
  • NA – North America
  • +
  • OC – Oceania
  • +
  • SA – South America
  • +
+
YES
Latitudedecimal + The approximate latitude of the location associated with the network. This value is not precise and should not be used to identify a particular address or household + YESYESYES
Longitudedecimal + The approximate longitude of the location associated with the network. Latitude and Longitude are often near the center of population. These values are not precise and should not be used to identify a particular address or household. + YESYESYES
Time zonestring + The time zone associated with the IP address. Time zone names are taken from + the IANA time zone database. See + the list of possible values. + + YES
AS numberstring + The autonomous system number associated with the IP address. + YES
User typeenum +

+ + The user type associated with the IP address. This will be one of the following + values. + +

+ +
    +
  • business
  • +
  • cafe
  • +
  • cellular
  • +
  • college
  • +
  • contentDeliveryNetwork
  • +
  • government
  • +
  • hosting
  • +
  • library
  • +
  • military
  • +
  • residential
  • +
  • router
  • +
  • school
  • +
  • searchEngineSpider
  • +
  • traveler
  • +
+ +
YES
Netspeedenum +

+ + The network speed associated with the IP address. This can be one of the + following values: + +

+ +
    +
  • Dialup
  • +
  • Cable/DSL
  • +
  • Corporate
  • +
  • Cellular
  • +
+ +
YES
Domainstring + The second level domain associated with the IP address. This will be + + something like "example.com" or "example.co.uk", not "foo.example.com". + + YES
ISP namestring + The name of the ISP associated with the IP address. + + YESYES
Organization namestring + The name of the organization associated with the IP address. + + YESYES
City confidence factorstring + A value from 0-100 representing our confidence that the city is correct. + + YES
Region confidence factorstring + A value from 0-100 representing our confidence that the region is correct. + + YES
Postal confidence factorstring + A value from 0-100 representing our confidence that the postal code is correct. + + YES
Country confidence factorstring + A value from 0-100 representing our confidence that the country is correct. + + YES
Error codestring +

+ If there was an error or warning with this request, this field + contains an error code string. +

+ +

+ The possible error codes are: +

+ +
    +
  • PERMISSION_REQUIRED – This is returned if you do not have permission to use the service. Please contact support@maxmind.com for more information.
  • +
  • + INVALID_LICENSE_KEY – This error will be returned + when the license key you pass is not a valid license key or when your account has run out of queries. +
  • +
  • LICENSE_REQUIRED – The Insight service returns this instead of INVALID_LICENSE_KEY.
  • +
  • + IP_NOT_FOUND – This error will be returned if the + IP address it not valid, if it is not public, or if it is not in + our GeoIP database. It will also be returned if you do not pass an + IP address at all. +
  • +
+
YESYESYESYES
+
+{{}} ### Output field order @@ -502,87 +505,91 @@ fields are returned must be known in order to parse the result. If the request is successful, the error field may be omitted entirely, since it always comes last. - - - - - - - - - - - - - - - - - - - - - - - - - -
ServiceField Order
Country -
    -
  • Country code
  • -
  • Error
  • -
-
City -
    -
  • Country code
  • -
  • Region code
  • -
  • City name
  • -
  • Latitude
  • -
  • Longitude
  • -
  • Error
  • -
-
City/ISP/Org -
    -
  • Country code
  • -
  • Region code
  • -
  • City name
  • -
  • Postal code
  • -
  • Latitude
  • -
  • Longitude
  • -
  • Metro code
  • -
  • Area code
  • -
  • ISP name
  • -
  • Organization name
  • -
  • Error
  • -
-
Insights -
    -
  • Country code
  • -
  • Country name
  • -
  • Region code
  • -
  • Region name
  • -
  • City name
  • -
  • Latitude
  • -
  • Longitude
  • -
  • Metro code
  • -
  • Area code
  • -
  • Time zone
  • -
  • Continent code
  • -
  • Postal code
  • -
  • ISP name
  • -
  • Organization name
  • -
  • Domain
  • -
  • AS number
  • -
  • Netspeed
  • -
  • User type
  • -
  • Accuracy radius
  • -
  • Country confidence factor
  • -
  • City confidence factor
  • -
  • Region confidence factor
  • -
  • Postal confidence factor
  • -
  • Error
  • -
-
+{{< rawhtml >}} +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
ServiceField Order
Country +
    +
  • Country code
  • +
  • Error
  • +
+
City +
    +
  • Country code
  • +
  • Region code
  • +
  • City name
  • +
  • Latitude
  • +
  • Longitude
  • +
  • Error
  • +
+
City/ISP/Org +
    +
  • Country code
  • +
  • Region code
  • +
  • City name
  • +
  • Postal code
  • +
  • Latitude
  • +
  • Longitude
  • +
  • Metro code
  • +
  • Area code
  • +
  • ISP name
  • +
  • Organization name
  • +
  • Error
  • +
+
Insights +
    +
  • Country code
  • +
  • Country name
  • +
  • Region code
  • +
  • Region name
  • +
  • City name
  • +
  • Latitude
  • +
  • Longitude
  • +
  • Metro code
  • +
  • Area code
  • +
  • Time zone
  • +
  • Continent code
  • +
  • Postal code
  • +
  • ISP name
  • +
  • Organization name
  • +
  • Domain
  • +
  • AS number
  • +
  • Netspeed
  • +
  • User type
  • +
  • Accuracy radius
  • +
  • Country confidence factor
  • +
  • City confidence factor
  • +
  • Region confidence factor
  • +
  • Postal confidence factor
  • +
  • Error
  • +
+
+
+{{}} ### Client Code Examples @@ -1059,7 +1066,7 @@ private string GetMaxMindInsightsData(string IP) { This is an example for the City/ISP/Org web service. -``` +```vbnet ' Contributed by Rubens A. Lucca Private Function ReturnData(ByVal IP As String) As String Dim objUrl As New System.Uri("https://geoip.maxmind.com/v.10/city-isp-org?l=YOUR_LICENSE_KEY&i=" & IP) @@ -1094,7 +1101,7 @@ Private Function ReturnData(ByVal IP As String) As String This is an example for the City/ISP/Org web service. -``` +```xml @@ -1138,7 +1145,7 @@ This is an example for the City/ISP/Org web service. This is an example for the City/ISP/Org web service. -``` +```vbnet Dim objHttp, strQuery strQuery = "https://geoip.maxmind.com/v1.0/city-isp-org?l=" & license_key & "&i=" & ipaddress set objHttp = Server.CreateObject("Msxml2.ServerXMLHTTP") @@ -1152,7 +1159,7 @@ Set objHttp = Nothing This is an example for the City/ISP/Org web service. -``` +```basic Set request = Server.CreateObject("AspHTTP.Conn") request.Url = "https://geoip.maxmind.com/v1.0/city-isp-org?l=" & license_key & "&i=" & ip_address request.RequestMethod = "GET" diff --git a/content/geoip/docs/web-services/sandbox-environment.md b/content/geoip/docs/web-services/sandbox-environment.md new file mode 100644 index 000000000..d3afa5803 --- /dev/null +++ b/content/geoip/docs/web-services/sandbox-environment.md @@ -0,0 +1,57 @@ +--- +draft: false +title: Testing GeoIP Web Services in the MaxMind Sandbox +--- + +{{< snippet "snippets/sandbox-intro.md" >}} + +## Generate a License Key for the Sandbox + +{{< snippet "snippets/sandbox-license-key.md" >}} + +## Build your integration + +Consult our [quick start guide](/geoip/geolocate-an-ip/web-services) or our +[list of client APIs](/geoip/geolocate-an-ip/web-services#client-apis) to +develop your integration. + +## Point your integration to the Sandbox service endpoints + +Use the service endpoints for the Sandbox version of the web services, as listed +in the table below: + +| Sandbox Service | HTTP Method | Endpoint | +| --------------- | ----------- | -------------------------------------------------------------- | +| Country | `GET` | `https://sandbox.maxmind.com/geoip/v2.1/country/{ip_address}` | +| City Plus | `GET` | `https://sandbox.maxmind.com/geoip/v2.1/city/{ip_address}` | +| Insights | `GET` | `https://sandbox.maxmind.com/geoip/v2.1/insights/{ip_address}` | + +Remember to use the license key generated by your Sandbox account to +authenticate your requests. + +## Test Data for the GeoIP Sandbox + +{{< alert info >}} +The Sandbox will return geolocation and IP intelligence data, but this data is +not accurate and should not be used to evaluate the efficacy of the minFraud +scoring engine, or for geolocation or IP intelligence. It is designed for +testing purposes only. +{{}} + +There are a limited number of IP addresses in the test database for the GeoIP +web services on the Sandbox. The Sandbox versions of the GeoIP web services use +[special test data that is published to GitHub](https://github.com/maxmind/MaxMind-DB/blob/main/source-data/). + +If you attempt to submit an IP address that doesn't exist in the test data, you +will receive an error stating that the IP address does not exist in our +database. + +The test data is displayed in JSON format, and would be the expected response +for a query using the listed IP address. +[Learn more about working with our GeoIP test data on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/8610782760731-Sandbox-for-the-GeoIP-Web-Services#h_01GC7FJGRWC116ZCDPAJP09V9M) + +{{< snippet "snippets/sandbox-limits.md" >}} + +## Learn more about the MaxMind Sandbox + +{{< snippet "snippets/sandbox-learn-more.md" >}} diff --git a/content/geoip/docs/web-services/sandbox-environment.mdx b/content/geoip/docs/web-services/sandbox-environment.mdx deleted file mode 100644 index b0112810a..000000000 --- a/content/geoip/docs/web-services/sandbox-environment.mdx +++ /dev/null @@ -1,46 +0,0 @@ ---- -draft: false -title: Testing GeoIP Web Services in the MaxMind Sandbox ---- - -import SandboxIntro from '/content/_sandbox-intro.mdx'; -import SandboxLicenseKey from '/content/_sandbox-license-key.mdx'; -import SandboxTestData from './_sandbox-geoip-test-data.mdx'; -import SandboxLimits from '/content/_sandbox-limits.mdx'; -import SandboxLearnMore from '/content/_sandbox-learn-more.mdx'; - - - -## Generate a License Key for the Sandbox - - - -## Build your integration - -Consult our [quick start guide](/geoip/geolocate-an-ip/web-services) or our -[list of client APIs](/geoip/geolocate-an-ip/web-services#client-apis) to -develop your integration. - -## Point your integration to the Sandbox service endpoints - -Use the service endpoints for the Sandbox version of the web services, as listed -in the table below: - -| Sandbox Service | HTTP Method | Endpoint | -| --------------- | ----------- | -------------------------------------------------------------- | -| Country | `GET` | `https://sandbox.maxmind.com/geoip/v2.1/country/{ip_address}` | -| City Plus | `GET` | `https://sandbox.maxmind.com/geoip/v2.1/city/{ip_address}` | -| Insights | `GET` | `https://sandbox.maxmind.com/geoip/v2.1/insights/{ip_address}` | - -Remember to use the license key generated by your Sandbox account to -authenticate your requests. - -## Test Data for the GeoIP Sandbox - - - - - -## Learn more about the MaxMind Sandbox - - diff --git a/content/geoip/updating-databases.md b/content/geoip/updating-databases.md index 5adebb125..793cd915b 100644 --- a/content/geoip/updating-databases.md +++ b/content/geoip/updating-databases.md @@ -167,13 +167,13 @@ CSV) format, which can be uncompressed using a program like For example, using the permalink for the GeoIP2 City CSV database, you can issue a `curl` command like the following: -```cli +```shell curl -O -J -L -u YOUR_ACCOUNT_ID:YOUR_LICENSE_KEY 'https://download.maxmind.com/geoip/databases/GeoIP2-City-CSV/download?suffix=zip' ``` Or a `wget` command like the following: -```cli +```shell wget --content-disposition --user=YOUR_ACCOUNT_ID --password=YOUR_LICENSE_KEY 'https://download.maxmind.com/geoip/databases/GeoIP2-City-CSV/download?suffix=zip' ``` diff --git a/content/geoip/upgrading-geoip-update.mdx b/content/geoip/upgrading-geoip-update.md similarity index 98% rename from content/geoip/upgrading-geoip-update.mdx rename to content/geoip/upgrading-geoip-update.md index c1a7dbe92..6bee92252 100644 --- a/content/geoip/upgrading-geoip-update.mdx +++ b/content/geoip/upgrading-geoip-update.md @@ -3,8 +3,7 @@ draft: false title: Upgrading GeoIP Update from v3.x to v4.0 and higher --- - - +{{< alert info >}} In 2019, we released a new major version of `geoipupdate`. This document describes how you can upgrade from versions 3.x to versions 4.x and higher. @@ -12,8 +11,7 @@ If you are upgrading from version 4.x and higher to the latest version, please consult the [changelog of the latest release](https://github.com/maxmind/geoipupdate/releases) for information. - - +{{}} ## What changed @@ -43,7 +41,7 @@ If you’re coming from `geoipupdate` 2\.x: You can do this by running `geoipupdate -V`: -```cli +```shell geoipupdate -V > geoipupdate 3.1.1 ``` @@ -61,7 +59,7 @@ Typically this will be `/etc/GeoIP.conf` or `/usr/local/etc/GeoIP.conf`. One way to do this is to run `geoipupdate` in verbose mode: -```cli +```shell geoipupdate -v > geoipupdate 3.1.1 > Opened License file /etc/GeoIP.conf @@ -83,7 +81,7 @@ If you previously installed it via `make install`, you should determine where it’s installed so you don’t end up with conflicting versions. You can run this command to check where it is: -```cli +```shell which geoipupdate > /usr/bin/geoipupdate ``` @@ -99,7 +97,7 @@ running 4.x. Run `geoipupdate` in verbose mode to verify it’s using the config file you expect and completes without error: -```cli +```shell geoipupdate -v > Using config file /etc/GeoIP.conf > ... diff --git a/content/geoip/whats-new-in-geoip2.mdx b/content/geoip/whats-new-in-geoip2.md similarity index 100% rename from content/geoip/whats-new-in-geoip2.mdx rename to content/geoip/whats-new-in-geoip2.md diff --git a/content/minfraud/_api-clients.mdx b/content/minfraud/_api-clients.mdx deleted file mode 100644 index b46a064f6..000000000 --- a/content/minfraud/_api-clients.mdx +++ /dev/null @@ -1,13 +0,0 @@ -The following APIs are developed and maintained by MaxMind. See -[our guide on developing for the community](/contribute) if you have questions -about creating or sharing your own unofficial clients or integrations. - -| Language or Framework | Package Repository | Documentation | Version Control | -| --------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------- | -| .NET (C#) | [NuGet](https://www.nuget.org/packages/MaxMind.MinFraud) | [GitHub Pages](https://maxmind.github.io/minfraud-api-dotnet) | [GitHub](https://github.com/maxmind/minfraud-api-dotnet) | -| Java | [Maven Central](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.maxmind.minfraud%22) | [GitHub Pages](https://maxmind.github.io/minfraud-api-java) | [GitHub](https://github.com/maxmind/minfraud-api-java) | -| Node.js | [NPM](https://npmjs.com/package/@maxmind/minfraud-api-node) | [GitHub Pages](https://maxmind.github.io/minfraud-api-node/) | [GitHub](https://github.com/maxmind/minfraud-api-node) | -| Perl (deprecated) | [metacpan](https://metacpan.org/release/WebService-MinFraud) | [metacpan](https://metacpan.org/pod/WebService::MinFraud) | [GitHub](https://github.com/maxmind/minfraud-api-perl) | -| PHP | [Packagist](https://packagist.org/packages/maxmind/minfraud) | [GitHub Pages](https://maxmind.github.io/minfraud-api-php) | [GitHub](https://github.com/maxmind/minfraud-api-php) | -| Python | [PyPI](https://pypi.python.org/pypi/minfraud) | [Read the Docs](https://minfraud.readthedocs.io/en/latest/) | [GitHub](https://github.com/maxmind/minfraud-api-python) | -| Ruby | [RubyGems.org](https://rubygems.org/gems/minfraud) | [RubyDoc.info](https://www.rubydoc.info/gems/minfraud/) | [GitHub](https://github.com/maxmind/minfraud-api-ruby) | diff --git a/content/minfraud/api-documentation/_schemas/Request.mdx b/content/minfraud/api-documentation/_schemas/Request.mdx deleted file mode 100644 index 12375a2b7..000000000 --- a/content/minfraud/api-documentation/_schemas/Request.mdx +++ /dev/null @@ -1,119 +0,0 @@ -import requestJson from '../_examples/request'; - - - Currently minFraud Score, minFraud Insights, and minFraud Factors use the same - request document format. The request consists of a JSON object with one or - more of the fields shown below. Each key in the top-level object maps to an - object or array as described below. New fields that apply to one or both may - be added in the future. - -String fields are limited to no more than 255 valid Unicode characters unless a -shorter length is specified; the null and newline characters are forbidden. Of -course, many fields also have additional constraints that limit the length. For -example, the `ip_address` field cannot be longer than the longest valid -representation of an IPv6 address. Unless it must match a specific format, it is -valid for a string field to be empty. - -Boolean fields must be provided as JSON `true` or `false`. - -Unless otherwise specified, if the value meets the requirements for the field, -then it will not be modified. Beyond field specific exceptions, an exception to -this is if the value is provided as a type different from what we require. In -such cases we convert it to the required type if possible. For example, if you -provide a string field as a number, then it will be converted to a string, and -vice versa. This conversion happens only between numbers and strings. - -The entire request body is limited to 20,000 bytes. Requests larger than this -size will be rejected. - - - This object contains information about the device used in the transaction. - - - - This object contains general information related to the event being scored. - - - - This object contains account information for the end-user on the site where - the event took place. - - - - This object contains information about the email address of the end-user - who initiated the event. - - - - This object contains the billing address and contact information provided by - the end-user who initiated the event. - - - - This object contains the shipping address and contact information provided - by the end-user who initiated the event. - - - - This object contains information from and about the payment process that - was used for the event. - - - - This object contains information provided by the end-user and the payment - processor about the credit card used for the for the event. - - - - This object contains information about the order associated with the event. - - - - This is an array of shopping cart item objects. A shopping cart should - consist of an array of one or more item objects. - - - - Custom Inputs are optional inputs to the minFraud service that must first be - defined for your account. Select “Custom Inputs” from the Account Portal in - order to do so. See our Custom Inputs documentation for more information. - - diff --git a/content/minfraud/api-documentation/_schemas/RequestAccount.mdx b/content/minfraud/api-documentation/_schemas/RequestAccount.mdx deleted file mode 100644 index eb7e394fe..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestAccount.mdx +++ /dev/null @@ -1,39 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains account information for the end-user on the site where - the event took place. - - - A unique user ID associated with the end-user in your system. If your system - allows the login name for the account to be changed, this should not be the - login name for the account, but rather should be an internal ID that does - not change. This is not your MaxMind account ID. No specific format is - required. - - [Learn more about the `/account/user_id` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452006111003#h_01G1E0XKAEF0BBC336545SY2AA) - - - - - An MD5 hash as a hexadecimal string of the username or login name associated - with the account. - - diff --git a/content/minfraud/api-documentation/_schemas/RequestBilling.mdx b/content/minfraud/api-documentation/_schemas/RequestBilling.mdx deleted file mode 100644 index 6cb24816f..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestBilling.mdx +++ /dev/null @@ -1,118 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains the billing address and contact information provided by - the end-user who initiated the event. - -[Learn more about the billing address inputs on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5447224594075-Billing-and-Shipping-Inputs#h_01G0YN48RWENDYCKN2J3RQK2S3) - - - The first name of the end user as provided in their billing information. - - - - The last name of the end user as provided in their billing information. - - - - The company of the end user as provided in their billing information. - - - - The first line of the user's billing address. - - - - The second line of the user's billing address. - - - - The city of the user's billing address. - - - - The [ISO 3166-2 subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2) - for the user's billing address. - - - - The two character [ISO 3166-1 alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) - of the user's billing address. - - - - The postal code of the user's billing address. - - - - The phone number without the country code for the user's billing address. - Punctuation characters will be stripped. After stripping punctuation - characters, the number must contain only digits. - - - - The country code for phone number associated with the user's billing - address. If you provide this information then you must provide at least one - digit. - - diff --git a/content/minfraud/api-documentation/_schemas/RequestCreditCard.mdx b/content/minfraud/api-documentation/_schemas/RequestCreditCard.mdx deleted file mode 100644 index a7b765c16..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestCreditCard.mdx +++ /dev/null @@ -1,155 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains information provided by the end-user and the payment - processor about the credit card used for the for the event. - - - The issuer ID number for the credit card. This is the first six or eight - digits of the credit card number. It identifies the issuing bank. If you do - not know whether the IIN is six or eight digits long, send us six digits. - - [Learn more about the `/credit_card/issuer_id_number` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0YWJK0M3R4Y4N0AD2S6X9G4) - - - - - The last digits of the credit card number. In most cases, you should send - the last four digits for `last_digits`. If you send an - [`issuer_id_number`](#schema--request--credit-card__issuer_id_number) - that contains an eight digit IIN, and if the credit card brand is not one - of the following, you should send the last two digits for `last_digits`: - `Discover`, `JCB`, `Mastercard`, `UnionPay`, `Visa`. - - [Learn more about the `/credit_card/last_digits` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0YWJW1KV6H4FEBWCMYA5HMW) - - - - - A token uniquely identifying the card. The token should consist of non-space - printable ASCII characters. If the token is all digits, it must be more than - 19 characters long. The token must not be a primary account number (PAN) or - a simple transformation of it. If you have a valid token that looks like a - PAN but is not one, you may prefix that token with a fixed string, e.g., - `token-`. - - [Learn more about the `/credit_card/token` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0YWHZK8D3N172REBAPXMQYY) - - - - - The name of the issuing bank as provided by the end user. - - - - The phone country code for the issuing bank as provided by the end user. If - you provide this information then you must provide at least one digit. - - - - The phone number, without the country code, for the issuing bank as provided - by the end user. Punctuation characters will be stripped. After stripping - punctuation characters, the number must contain only digits. - - - - The two character [ISO 3166-1 alpha-2 country - code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) where the issuer of - the card is located. This may be passed instead of the - [`issuer_id_number`](#schema--request--credit-card__issuer_id_number) if - you do not wish to pass partial account numbers, or if your payment - processor does not provide them. - - [Learn more about the `/credit_card/country` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0Z6QZAYZ74FCVPN2PHZ4ZA8) - - - - - The address verification system (AVS) check result, as returned to you by - the credit card processor. The minFraud service supports the standard AVS - codes. - - [Learn more about the `/credit_card/avs_result` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0YWK5CMEVG2YMTPQ11346QV) - - - - - The card verification value (CVV) code as provided by the payment processor. - - [Learn more about the `/credit_card/cvv_result` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0YWK5CMEVG2YMTPQ11346QV) - - - - - Whether the outcome of 3-D Secure verification (e.g. Safekey, SecureCode, - Verified by Visa) was successful. `true` if customer verification was - successful, or `false` if the customer failed verification. If 3-D Secure - verification was not used, was unavailable, or resulted in another outcome - other than success or failure, do not include this field. - - [Learn more about the `/credit_card/was_3d_secure_successfil` input on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5450338695963-Credit-Card-and-Payments-Inputs#h_01G0YWK5CMEVG2YMTPQ11346QV) - - - diff --git a/content/minfraud/api-documentation/_schemas/RequestCustomInputs.mdx b/content/minfraud/api-documentation/_schemas/RequestCustomInputs.mdx deleted file mode 100644 index e56c4e884..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestCustomInputs.mdx +++ /dev/null @@ -1,65 +0,0 @@ -import requestJson from '../_examples/request'; - - - Custom Inputs are optional inputs to the minFraud service that must first be - defined for your account. Select Custom Inputs from the Account Portal in - order to do so. See our [Custom Inputs documentation](https://support.maxmind.com/hc/en-us/articles/4408216546203-Use-Custom-Inputs) - for more information. - - - **You should never send a full credit card number as an input.** If you - attempt to send a full credit card number as an input, the minFraud - service will reject the input and issue a warning. - - [Learn more about valid payment number inputs above.](#schema--request--credit-card) - - - - A custom key of your choice, with a boolean value. - - - - A custom key of your choice, with a floating number value. - - - - A custom key of your choice with a string value, formatted as a phone - number. Numbers, spaces and punctuation accepted, although spaces and - punctuation will be stripped. The following ASCII characters constitute - the accepted punctuation: {'` ~ ! @ # $ % ^ & * ( ) – _ = + ‘ ” ; : , < . > / ? \\ | [ ] { and }'}. - - - - A custom key of your choice with a string value. The null character is not - allowed. - - diff --git a/content/minfraud/api-documentation/_schemas/RequestDevice.mdx b/content/minfraud/api-documentation/_schemas/RequestDevice.mdx deleted file mode 100644 index 47e0055cd..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestDevice.mdx +++ /dev/null @@ -1,81 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains information about the device used in the transaction. - - - The IP address associated with the device used by the customer in the - transaction. The IP address must be in IPv4 or IPv6 presentation format, - i.e., dotted-quad notation or the IPv6 hexadecimal-colon notation. - - [Get tips for how to pass the `/device/ip_address` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5444495353883-Device-Inputs#h_01G0YJ5QHRCS6JBJXJGWPB7DZB) - - - - - The HTTP `User-Agent` header of the browser used in the transaction. - - [Learn more about the `/device/user_agent` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5444495353883-Device-Inputs#h_01G0YJ6YV72W9H65KZ3SEEM6CH) - - - - - The HTTP `Accept-Language` header of the device used in the transaction. - - [Learn more about the `/device/accept_language` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5444495353883-Device-Inputs#h_01G0YJ6YV72W9H65KZ3SEEM6CH) - - - - - The number of seconds between the creation of the user's session and the - time of the transaction. Note that `session_age` is not the duration of the - current visit, but the time since the start of the first visit. - - [Learn more about the `/device/session_age` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5444495353883-Device-Inputs#h_01G0YJ77MFVS4XW63W9G2Y1Y65) - - - - - An ID that uniquely identifies a visitor's session on the site. - - [Learn more about the `/device/session_id` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5444495353883-Device-Inputs#h_01G0YJ77MFVS4XW63W9G2Y1Y65) - - - diff --git a/content/minfraud/api-documentation/_schemas/RequestEmail.mdx b/content/minfraud/api-documentation/_schemas/RequestEmail.mdx deleted file mode 100644 index 239203510..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestEmail.mdx +++ /dev/null @@ -1,43 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains information about the email address of the end-user - who initiated the event. - - - This field must be either be a valid email address or an MD5 of the email - used in the transaction. - - [Learn more about the `/email/address` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5451485951387) - - - - - The domain of the email address used in the transaction. Do not include the - `@` in this field. - - - You do not need to pass the email domain input unless you are passing the - email address as an MD5 hash. [Learn more about hashed email inputs on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5451485951387#h_01G0Z373C3H1QA68TTHVYMXGTT) - - - - diff --git a/content/minfraud/api-documentation/_schemas/RequestEvent.mdx b/content/minfraud/api-documentation/_schemas/RequestEvent.mdx deleted file mode 100644 index 089f8c474..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestEvent.mdx +++ /dev/null @@ -1,88 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains general information related to the event being scored. - - - Your internal ID for the transaction. We can use this to locate a specific - transaction in our logs, and it will also show up in email alerts and - notifications from us to you. No specific format is required. - - [Learn more about the `/event/transaction_id` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452006111003-Event-and-Account-Inputs#h_01G1E0X7TPRN41NZHH9TRFWHVN) - - - - - Your internal ID for the shop, affiliate, or merchant this order is coming - from. Required for minFraud users who are resellers, payment providers, - gateways and affiliate networks. No specific format is required. - - [Learn more about the `/event/shop_id` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452006111003-Event-and-Account-Inputs#h_01G1E0WZ6PPV7VVKCKQM5N9960) - - - - - The date and time the event occurred. The string must be in the - [RFC 3339](https://tools.ietf.org/html/rfc3339) date-time format. The time - must be within the past year. If this field is not in the request, the - current time will be used. - - - **It is not recommended to use this input when scoring live transactions - as they occur.** However, it can be useful if you store transactions to be - submitted to the service for scoring later. - - Please note that you cannot submit times more than one year in the past. - If you submit an event time more than one year in the past, the current - time will be used to score the transaction, and a warning will be - returned. - - - - [Learn more about the `/event/time` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452006111003-Event-and-Account-Inputs#h_01G0Z3WBNAP5Y8WNRR156EJBBF) - - - - - The type of event being scored. The valid types are: - - * `account_creation` - * `account_login` - * `email_change` - * `password_reset` - * `payout_change` - * `purchase` - * `recurring_purchase` - * `referral` - * `survey` - - [Learn more about the `/event/type` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452006111003-Event-and-Account-Inputs#h_01G0Z3WMWJW3QMHN8AGWK054E6) - - - diff --git a/content/minfraud/api-documentation/_schemas/RequestOrder.mdx b/content/minfraud/api-documentation/_schemas/RequestOrder.mdx deleted file mode 100644 index 42a622f2f..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestOrder.mdx +++ /dev/null @@ -1,115 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains information about the order associated with the event. - - - The total order amount for the transaction before taxes and discounts. - - [Learn more about the `/order/amount` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z50FDAR22FR731C0CD2AE4) - - - - - The [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) for the - currency used in the transaction. - - [Learn more about the `/order/currency` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z50FDAR22FR731C0CD2AE4) - - - - - The discount code applied to the transaction. If multiple discount codes - were used, please separate them with a comma. - - [Learn more about the `/order/discount_code` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z50ZVZ2GMAF4DG4N0FA73W) - - - - - The ID of the affiliate where the order is coming from. No specific format - is required. - - [Learn more about the `/order/affiliate_id` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z50Q0MRXQ5R52EF34E6G7J) - - - - - The ID of the sub-affiliate where the order is coming from. No specific - format is required. - - [Learn more about the `/order/subaffiliate_id` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z50Q0MRXQ5R52EF34E6G7J) - - - - - The URI of the referring site for this order. Needs to be absolute and have - a URI scheme such as `https://`. - - [Learn more about the `/order/referrer_uri` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z50Q0MRXQ5R52EF34E6G7J) - - - - - Whether order was marked as a gift by the purchaser. - - [Learn more about the `/order/is_gift` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z517AZEMSN8V3GWTV131S6) - - - - - Whether the purchaser included a gift message. - - [Learn more about the `/order/has_gift_message` input on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z517AZEMSN8V3GWTV131S6) - - - diff --git a/content/minfraud/api-documentation/_schemas/RequestPayment.mdx b/content/minfraud/api-documentation/_schemas/RequestPayment.mdx deleted file mode 100644 index 9b80041f7..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestPayment.mdx +++ /dev/null @@ -1,200 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains information from and about the payment process that - was used for the event. - - - The payment processor used for the transaction. The valid values are: - - * `adyen` - * `affirm` - * `afterpay` - * `altapay` - * `amazon_payments` - * `american_express_payment_gateway` - * `apple_pay` - * `aps_payments` - * `authorizenet` - * `balanced` - * `beanstream` - * `bluepay` - * `bluesnap` - * `boacompra` - * `boku` - * `bpoint` - * `braintree` - * `cardknox` - * `cardpay` - * `cashfree` - * `ccavenue` - * `ccnow` - * `cetelem` - * `chase_paymentech` - * `checkout_com` - * `cielo` - * `collector` - * `commdoo` - * `compropago` - * `concept_payments` - * `conekta` - * `coregateway` - * `creditguard` - * `credorax` - * `ct_payments` - * `cuentadigital` - * `curopayments` - * `cybersource` - * `dalenys` - * `dalpay` - * `datacap` - * `datacash` - * `dibs` - * `digital_river` - * `dlocal` - * `dotpay` - * `ebs` - * `ecomm365` - * `ecommpay` - * `elavon` - * `emerchantpay` - * `epay` - * `eprocessing_network` - * `epx` - * `eway` - * `exact` - * `first_atlantic_commerce` - * `first_data` - * `fiserv` - * `g2a_pay` - * `global_payments` - * `gocardless` - * `google_pay` - * `heartland` - * `hipay` - * `ingenico` - * `interac` - * `internetsecure` - * `intuit_quickbooks_payments` - * `iugu` - * `klarna` - * `komoju` - * `lemon_way` - * `mastercard_payment_gateway` - * `mercadopago` - * `mercanet` - * `merchant_esolutions` - * `mirjeh` - * `mollie` - * `moneris_solutions` - * `neopay` - * `neosurf` - * `nmi` - * `oceanpayment` - * `oney` - * `onpay` - * `openbucks` - * `openpaymx` - * `optimal_payments` - * `orangepay` - * `other` - * `pacnet_services` - * `payconex` - * `payeezy` - * `payfast` - * `paygate` - * `paylike` - * `payment_express` - * `paymentwall` - * `payone` - * `paypal` - * `payplus` - * `paysafecard` - * `paysera` - * `paystation` - * `paytm` - * `paytrace` - * `paytrail` - * `payture` - * `payulatam` - * `payvision` - * `payu` - * `payway` - * `payza` - * `pinpayments` - * `placetopay` - * `posconnect` - * `princeton_payment_solutions` - * `psigate` - * `pxp_financial` - * `qiwi` - * `quickpay` - * `raberil` - * `razorpay` - * `rede` - * `redpagos` - * `rewardspay` - * `safecharge` - * `sagepay` - * `securetrading` - * `shopify_payments` - * `simplify_commerce` - * `skrill` - * `smartcoin` - * `smartdebit` - * `solidtrust_pay` - * `sps_decidir` - * `stripe` - * `synapsefi` - * `systempay` - * `telerecargas` - * `towah` - * `transact_pro` - * `trustly` - * `trustpay` - * `tsys` - * `usa_epay` - * `vantiv` - * `verepay` - * `vericheck` - * `vindicia` - * `virtual_card_services` - * `vme` - * `vpos` - * `windcave` - * `wirecard` - * `worldpay` - - - If your payment processor is missing from this list, please contact - support@maxmind.com. - - - - - The authorization outcome from the payment processor. If the transaction has - not yet been approved or denied, do not include this field. - - - - The decline code as provided by your payment processor. If the transaction - was not declined, do not include this field. - - diff --git a/content/minfraud/api-documentation/_schemas/RequestShipping.mdx b/content/minfraud/api-documentation/_schemas/RequestShipping.mdx deleted file mode 100644 index 2842114d4..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestShipping.mdx +++ /dev/null @@ -1,133 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains the shipping address and contact information provided - by the end-user who initiated the event. - -[Learn more about the shipping address inputs on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5447224594075-Billing-and-Shipping-Inputs#h_01G0YN4GGRCC99P2HH0X54RFVA) - - - The first name of the end user as provided in their shipping information. - - - - The last name of the end user as provided in their shipping information. - - - - The company of the end user as provided in their shipping information. - - - - The first line of the user's shipping address. - - - - The second line of the user's shipping address. - - - - The city of the user's shipping address. - - - - The [ISO 3166-2 subdivision code](https://en.wikipedia.org/wiki/ISO_3166-2) - for the user's shipping address. - - - - The two character [ISO 3166-1 alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) - of the user's shipping address. - - - - The postal code of the user's shipping address. - - - - The phone number without the country code for the user's shipping address. - Punctuation characters will be stripped. After stripping punctuation - characters, the number must contain only digits. - - - - The country code for phone number associated with the user's shipping - address. If you provide this information then you must provide at least one - digit. - - - - The shipping delivery speed for the order. The valid values are: - - * `same_day` - * `overnight` - * `expedited` - * `standard` - - - diff --git a/content/minfraud/api-documentation/_schemas/RequestShoppingCart.mdx b/content/minfraud/api-documentation/_schemas/RequestShoppingCart.mdx deleted file mode 100644 index e722869fc..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestShoppingCart.mdx +++ /dev/null @@ -1,13 +0,0 @@ -import requestJson from '../_examples/request'; - - - This is an _array_ of [shopping cart item objects](#schema--request--shopping-cart--item). - A shopping cart should consist of an array of one or more item objects. - -[Learn more about the shopping cart inputs on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/5452293435675-Order-and-Shopping-Cart-Inputs#h_01G0Z51P845R5DG7TCRNSKAD44) - - diff --git a/content/minfraud/api-documentation/_schemas/RequestShoppingCartItem.mdx b/content/minfraud/api-documentation/_schemas/RequestShoppingCartItem.mdx deleted file mode 100644 index 0325bbf4a..000000000 --- a/content/minfraud/api-documentation/_schemas/RequestShoppingCartItem.mdx +++ /dev/null @@ -1,68 +0,0 @@ -import requestJson from '../_examples/request'; - - - This object contains information about an item from the end-user's shopping - cart associated with the event - - - The category of the item. This can also be a hashed value; see below. - - - - Your internal ID for the item. No specific format is required. This can also - be a hashed value; see below. - - - - The quantity of the item in the shopping cart. The value must be a whole - number. - - - - The per-unit price of this item in the shopping cart. This should use the - same currency as the order currency. - - - - Passing hashed values for shopping cart items can increase the privacy of - your customers' information while continuing to fulfill the needs for fraud - detection. A suitable hashed value can be produced by using a cryptographic - hash function and a fixed salt. **Using a random salt is not recommended** - as that will result in different hashed values for the same plain value, - which would make them ineffective for our fraud detection service. For more - information, see: - - * [OWASP Cryptographic Storage Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html) - * [NIST FIPS Secure Hash Standard (SHS)](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf) - - - diff --git a/content/minfraud/api-documentation/_schemas/Response.mdx b/content/minfraud/api-documentation/_schemas/Response.mdx deleted file mode 100644 index fe3e124a5..000000000 --- a/content/minfraud/api-documentation/_schemas/Response.mdx +++ /dev/null @@ -1,205 +0,0 @@ -import responseJson from '../_examples/response'; - - -The following is an example of a complete minFraud Factors response, including -all available outputs. In practice, fewer outputs may be returned based on the -minFraud service you query and the inputs provided. - - - This is the minFraud ID, a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) - that identifies the minFraud response. Use this ID to - [search your minFraud logs](https://www.maxmind.com/en/minfraud-log) or when - making support requests to MaxMind. - - - - This field contains the overall risk score, from 0.01 to 99. A higher score - indicates a higher risk of fraud. For example, a score of 20 indicates a - 20% chance that a transaction is fraudulent. We never return a risk score - of 0, since all transactions have the possibility of being fraudulent. - Likewise we never return a risk score of 100. - - [Learn more about the overall risk score on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408382414235) - - - - - The approximate US dollar value of the funds remaining on your MaxMind - account. - - - - The approximate number of queries remaining for the service before your - account runs out of funds. - - - - This object contains a risk score and (for minFraud Insights and Factors - requests) risk data for the IP address associated with the event. - - - - This object contains minFraud information related to the credit card. - - - - This object contains information about the device that MaxMind believes is - associated with the IP address passed in the request. - - - - This object contains information about the email address passed in the - request. - - - - This object contains minFraud response data associated with the shipping - address. If the shipping address was not provided in the request or could - not be parsed, this object will not be present in the response. - - - - This object contains minFraud response data associated with the shipping - phone. If the shipping phone was not provided in the request or could - not be parsed, this object will not be present in the response. - - - - This object contains minFraud response data associated with the billing - address. If the billing address was not provided in the request or could - not be parsed, this object will not be present in the response. - - - - This object contains minFraud response data associated with the billing - phone. If the billing phone was not provided in the request or could - not be parsed, this object will not be present in the response. - - - - This object contains information about how a request was handled by the - [custom rules](https://www.maxmind.com/en/solutions/minfraud-services/custom-rules) - you have defined. If your account does not have any custom rules defined, - then this object will not be present in the response. - - - - - The risk reasons output codes and reasons are currently in beta and are subject to change. - These outputs are being actively developed and tested, and may undergo modifications that could impact their structure, format, and content. - While we strive to maintain stability, we recommend that you use these beta outputs with caution and avoid relying on them for critical applications. - Your feedback is valuable and will help us improve the final release. - - - This array contains objects that describe risk score reasons for a given transaction that change the risk score significantly. - Risk score reasons are usually only returned for medium to high risk transactions. If there were no significant changes to the risk score due to these reasons, then this array will not be present in the response. - - - - - This object contains risk factor scores for many of the individual - components that are used in calculating the `risk_score`. - - - - This array contains warning objects detailing issues with the request that - was sent such as invalid or unknown inputs. It is highly recommended that - you check this array for issues when integrating the web service. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseBillingAddress.mdx b/content/minfraud/api-documentation/_schemas/ResponseBillingAddress.mdx deleted file mode 100644 index 18af27181..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseBillingAddress.mdx +++ /dev/null @@ -1,88 +0,0 @@ -import responseJson from '../_examples/response'; - - - - This field is `true` if the postal code provided with the address is in the - city for the address. The field is `false` when the postal code is not in - the city. The key will only be present when a billing postal code, city, - and country have been provided. - - We use [GeoNames data](https://www.geonames.org/postal-codes/postal-codes-us.html) - for the postal-city match, which uses the [preferred place name](https://en.wikipedia.org/wiki/ZIP_Code#Preferred_place_names:_ZIP_Codes_and_previous_zoning_lines) - for a US ZIP code. [Alternative place names](https://en.wikipedia.org/wiki/ZIP_Code#Preferred_place_names:_ZIP_Codes_and_previous_zoning_lines) - for US ZIP codes may not trigger a match for this field. - - [Learn how to use the postal to city check for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TV1Z2BRWCHVBK1ZE8276E) - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - latitude associated with the address. - - - **Latitude and longitude are not precise and should not be used to - identify a particular street address or household.** - - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - longitude associated with the address. - - - **Latitude and longitude are not precise and should not be used to - identify a particular street address or household.** - - - - - - The distance in kilometers from the address to the IP location. We fall back - to country or subdivision information if we do not have postal or city - information for an IP address, which may lead to inaccurate distance - calculations. - - [Learn how to use the IP geolocation to address distance for risk analysis - on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVDXWSBQR55FJ0K2KWGJQ) - - - - - This field is `true` if the address is in the IP country. The field is - `false` when the address is not in the IP country. If the IP address could - not be geolocated or no billing address was provided, the field will not be - included in the response. - - [Learn how to use the IP location to country check for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVDXWSBQR55FJ0K2KWGJQ) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseBillingPhone.mdx b/content/minfraud/api-documentation/_schemas/ResponseBillingPhone.mdx deleted file mode 100644 index 8c49ca017..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseBillingPhone.mdx +++ /dev/null @@ -1,36 +0,0 @@ -import responseJson from '../_examples/response'; - - - - A two-character [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) country code for the country associated with the billing phone number. - - - - The name of the original network operator associated with the billing phone number. This field does not reflect phone numbers that have been ported from the original operator to another, nor does it identify [mobile virtual network operators](https://en.wikipedia.org/wiki/Mobile_virtual_network_operator). - - - - One of the following values: `fixed` or `mobile`. Additional values may be added in the future. - - - - This is `true` if the billing phone number is a Voice over Internet Protocol (VoIP) number allocated by a regulator. It is `false` if the billing phone number is not a VoIP number allocated by a regulator. The key is only present when a valid billing phone number has been provided and we have data for it. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseCommonAddressProperties.mdx b/content/minfraud/api-documentation/_schemas/ResponseCommonAddressProperties.mdx deleted file mode 100644 index e21fb5872..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseCommonAddressProperties.mdx +++ /dev/null @@ -1,71 +0,0 @@ - - This field is `true` if the postal code provided with the address is in the - city for the address. The field is `false` when the postal code is not in - the city. The key will only be present when a billing postal code, city, - and country have been provided. - -We use -[GeoNames data](https://www.geonames.org/postal-codes/postal-codes-us.html) for -the postal-city match, which uses the -[preferred place name](https://en.wikipedia.org/wiki/ZIP_Code#Preferred_place_names:_ZIP_Codes_and_previous_zoning_lines) -for a US ZIP code. -[Alternative place names](https://en.wikipedia.org/wiki/ZIP_Code#Preferred_place_names:_ZIP_Codes_and_previous_zoning_lines) -for US ZIP codes may not trigger a match for this field. - -[Learn how to use the postal to city check for risk analysis on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TV1Z2BRWCHVBK1ZE8276E) - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - latitude associated with the address. - - - **Latitude and longitude are not precise and should not be used to - identify a particular street address or household.** - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - longitude associated with the address. - - - **Latitude and longitude are not precise and should not be used to - identify a particular street address or household.** - - - - - The distance in kilometers from the address to the IP location. - -[Learn how to use the IP geolocation to address distance for risk analysis on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVDXWSBQR55FJ0K2KWGJQ) - - - - - This field is `true` if the address is in the IP country. The field is - `false` when the address is not in the IP country. If the IP address could - not be geolocated or no billing address was provided, the field will not be - included in the response. - -[Learn how to use the IP location to country check for risk analysis on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVDXWSBQR55FJ0K2KWGJQ) - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseCreditCard.mdx b/content/minfraud/api-documentation/_schemas/ResponseCreditCard.mdx deleted file mode 100644 index 59ddfe96e..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseCreditCard.mdx +++ /dev/null @@ -1,114 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains minFraud information related to the credit card. If an - issuer ID number (IIN) was not provided in the request, this object will not - be present in the response. - - - This field contains a JSON object with information relating to the credit card issuer. - - - - The card brand, such as "Visa", "Discover", "American Express", etc. - - [Learn how to use the credit card brand data for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408734452123-Credit-Card-Risk-Data#h_01FN6TY3X4AHK80QZ85KXX6BZZ) - - - - - The two letter [ISO 3166-1 alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) - associated with the location of the majority of customers using this credit - card as determined by their billing address. In cases where the location of - customers is highly mixed, this defaults to the country of the bank issuing - the card. - - [Learn how to use the credit card country data for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408734452123-Credit-Card-Risk-Data#h_01FN6TYNBCSRH25VWPQ1CGNN27) - - - - - This field is `true` if the issuer ID number is for a business card. It is - `false` if the issuer ID number is for for a non-business card. The key is - only present when a valid issuer ID number has been provided. - - - - This field is `true` if the country of the billing address matches the - country of the majority of customers using that IIN. It is `false` if both - countries are available but do not match. If one or both of the countries - are missing, the key will not be present. In cases where the location of - customers is highly mixed, the match is to the country of the bank issuing - the card. - - [Learn how to use the billing address to credit card country matching for - risk analysis on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVQNAXWEBB1T2JW4DNZAX) - - - - - This field is `true` if the issuer ID number is for a prepaid card. It is - `false` if the issuer ID number is for for a non-prepaid card. The key is - only present when a valid issuer ID number has been provided. - - [Learn how to use prepaid card detection for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408734452123-Credit-Card-Risk-Data#h_01FN6TXRB1E35Q7Z7BGENRV7MC) - - - - - This field is `true` if the issuer ID number is for a virtual card. It is - `false` if the issuer ID number is for a non-virtual card. The key is only - present when a valid issuer ID number has been provided. - - [Learn how to use virtual card detection for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408734452123-Credit-Card-Risk-Data#h_01FN6TXRB1E35Q7Z7BGENRV7MC) - - - - - The card’s type. The valid values are: - - * `charge` – See [Wikipedia](https://en.wikipedia.org/wiki/Charge_card) for - an explanation of the difference between charge and credit cards. - * `credit` - * `debit` - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseCreditCardIssuer.mdx b/content/minfraud/api-documentation/_schemas/ResponseCreditCardIssuer.mdx deleted file mode 100644 index 3808bb2e4..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseCreditCardIssuer.mdx +++ /dev/null @@ -1,58 +0,0 @@ -import responseJson from '../_examples/response'; - - - This is a sub-object of `credit_card` that contains information related to the - issuer of the card. - - - This field contains a JSON object with information relating to the credit card issuer. - - [Learn how to use the credit card issuer name for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408734452123-Credit-Card-Risk-Data#h_01FN6TY3X4AHK80QZ85KXX6BZZ) - - - - - This field is `true` if the name matches the name provided in the request - for the card issuer. It is `false` if the name does not match. The field is - not included if either no name or issuer ID number (IIN) is provided in the - request or if MaxMind does not have a name associated with the IIN. - - - - The phone number of the bank which issued the credit card. In some cases the - phone number we return may be out of date. - - - - This field is `true` if the phone number matches the number provided in the - request for the card issuer. It is `false` if the number does not match. The - field is not included if either no phone number or issuer ID number (IIN) is - provided in the request or if MaxMind does not have a phone number - associated with the IIN. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseDevice.mdx b/content/minfraud/api-documentation/_schemas/ResponseDevice.mdx deleted file mode 100644 index a172b7206..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseDevice.mdx +++ /dev/null @@ -1,72 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains information about the device that MaxMind believes is - associated with the IP address passed in the request. - - - A number from 0.01 to 99 representing the confidence that the `/device/id` - refers to a unique device as opposed to a cluster of similar devices. A - confidence of 0.01 indicates very low confidence that the device is unique, - whereas 99 indicates very high confidence. - - [Learn how to use device confidence for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408634894107-Device-Risk-Data#h_01FN6V1ANY9XA76Z69HG2DZ5TJ) - - - - - A UUID that MaxMind uses for the device associated with this IP address. - This is only available if you are using the - [Device Tracking Add-on](/minfraud/api-documentation#device-tracking-add-on). - - - - The date and time of the last sighting of the device. The value is formatted - according to [RFC 3339](https://tools.ietf.org/html/rfc3339). - - [Learn how to use the last sighting data for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408634894107-Device-Risk-Data#h_01FN6V29YM8FA1A48G0N2G7VRW) - - - - - The local date and time of the transaction in the time zone of the device. - This is determined by using the UTC offset associated with the device. - The value is formatted according to [RFC 3339](https://tools.ietf.org/html/rfc3339). - - [Learn how to use local time data for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408634894107-Device-Risk-Data#h_01FN6V22JSGD7JP7Y3C9YBERHE) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseDisposition.mdx b/content/minfraud/api-documentation/_schemas/ResponseDisposition.mdx deleted file mode 100644 index caf50a441..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseDisposition.mdx +++ /dev/null @@ -1,97 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains information about how a request was handled by the - custom rules you have defined. If your account does not have any custom rules - defined, then this object will not be present in the response. - -[Learn about custom rules and dispositions on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408801942811-Use-Custom-Rules-and-Dispositions) - - - This describes how the request was handled. The valid values are: - - - - - - - - - - - - - - - - - - - - - - - - - - -
ActionExplanation
`accept` - This is the default value that is used if none of your custom rules - match the request. -
`reject`{' '}
`manual_review`{' '}
`test` - This value can be used to test custom rules. -
- -
- - - This describes why the `action` was set to a particular value. The valid - values are: - - - - - - - - - - - - - - - - - - -
ReasonExplanation
`default` - No custom rules matched the request. -
`custom_rule`A custom rule was applied and set the action.
- -
- - - The custom rule that was triggered. If you do not have custom rules set up, - the triggered custom rule does not have a label, or no custom rule was - triggered, the field will not be included in the response. - - -
diff --git a/content/minfraud/api-documentation/_schemas/ResponseEmail.mdx b/content/minfraud/api-documentation/_schemas/ResponseEmail.mdx deleted file mode 100644 index ec7c8d05c..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseEmail.mdx +++ /dev/null @@ -1,74 +0,0 @@ -import responseJson from '../_examples/response'; - - - - This field contains a JSON object with information relating to the domain. - - - - A date string (e.g. 2017-04-24) to identify the date an email address was - first seen by MaxMind. This is expressed using the ISO 8601 date format - YYYY-MM-DD. The earliest date that may be returned is January 1, 2008. - - [Learn how to use email first seen data for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data#h_01FN6V59SHH0J0MRH041K46NE0) - - - - - This field is `true` if MaxMind believes that the email address is from a - disposable email provider. It is `false` if the address is not from a known - disposable email provider. The key will only be present if a valid email - address or email domain is provided. - - [Learn how to use disposable email detection for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data#h_01FN6V5QYMX2DYRB4YSFM93F8D) - - - - - This field is `true` if MaxMind believes that this email domain is for a - free email provider such as Gmail or Yahoo! Mail. It is `false` if the - domain is not for a known free email provider. The key will only be present - if a valid email address or email domain is provided. - - [Learn how to use free email detection for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data#h_01FN6V5QYMX2DYRB4YSFM93F8D) - - - - - This field is `true` if MaxMind believes that this email address is likely - to be used for fraud. It is `false` if MaxMind does not believe the address - is used for fraud. The key will only be present if a valid email address or - email address hash is provided. Note that this is also factored into the - overall `risk_score` in the response as well. - - [Learn how to use our high risk email flag for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data#h_01FN6V50N3JM0YV92SJMJSRR37) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseEmailDomain.mdx b/content/minfraud/api-documentation/_schemas/ResponseEmailDomain.mdx deleted file mode 100644 index 0bbef73a9..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseEmailDomain.mdx +++ /dev/null @@ -1,30 +0,0 @@ -import responseJson from '../_examples/response'; - - - This is a sub-object of `email` that contains information related to the - domain. - - - A date string (e.g. 2019-01-01) to identify the date an email address - domain was first seen by MaxMind. This is expressed using the ISO 8601 date - format `YYYY-MM-DD`. The earliest date that may be returned is January 1, 2019. - - [Learn how to use email first seen data for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408562891803-Email-Risk-Data#h_01FN6V59SHH0J0MRH041K46NE0) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseIpAddress.mdx b/content/minfraud/api-documentation/_schemas/ResponseIpAddress.mdx deleted file mode 100644 index d52f6167a..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseIpAddress.mdx +++ /dev/null @@ -1,85 +0,0 @@ -import responseJson from '../_examples/response'; - - - For minFraud Score, this object only contains the `risk` for the IP address. - For minFraud Insights and Factors, the object is the - [GeoIP2 Insights response body](/geoip/docs/web-services/responses/#geoip2-insights-body-example) - with four modifications: - -1. `risk` has been added directly to the `ip_address` object -2. `local_time` has been added to the `location` sub-object -3. The `maxmind` object is not present. See below for descriptions. -4. minFraud Insights and Factors return the following anonymous IP outputs: - - - `is_anonymous` - - `is_anonymous_vpn` - - `is_hosting_provider` - - `is_public_proxy` - - `is_residential_proxy` - - `is_tor_exit_node` - -See the -[GeoIP2 Insights response body](/geoip/docs/web-services/responses/#geoip2-insights-body-example) -for more information. - - - This field contains the risk associated with the IP address. The value - ranges from 0.01 to 99. A higher score indicates a higher risk. - - [Learn more about the IP risk score on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408382525851-Device-Risk-Scores#h_01FN6HE00G80Y22P4WSXJ81C6Y) - - - - - This object contains country-level geolocation data associated with the IP - address associated with the event. - - - - This object contains city-level geolocation data associated with the IP - address associated with the event. - - - - This array contains [IP Address Risk Reason objects](#schema--response--ip-address--risk-reason) - identifying the reasons why the IP address received the associated risk. - - [Learn how to use IP risk reasons for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408418812827-IP-Risk-Reasons) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseIpAddressCountry.mdx b/content/minfraud/api-documentation/_schemas/ResponseIpAddressCountry.mdx deleted file mode 100644 index 9c6431f7d..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseIpAddressCountry.mdx +++ /dev/null @@ -1,22 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains country-level geolocation data associated with the IP - address associated with the event - - - This field has been deprecated. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseIpAddressLocation.mdx b/content/minfraud/api-documentation/_schemas/ResponseIpAddressLocation.mdx deleted file mode 100644 index b64090c8b..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseIpAddressLocation.mdx +++ /dev/null @@ -1,26 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains city-level geolocation data associated with the IP - address associated with the event. - - - The date and time of the transaction in the time zone associated with the - IP address. The value is formatted according to [RFC 3339](https://tools.ietf.org/html/rfc3339). - For instance, the local time in Boston might be returned as - `2015-04-27T19:17:24-04:00`. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReason.mdx b/content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReason.mdx deleted file mode 100644 index 8b6c519d7..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReason.mdx +++ /dev/null @@ -1,95 +0,0 @@ -import responseJson from '../_examples/response'; - - - - This value is a machine-readable code identifying the reason. Although more - codes may be added in the future, the current codes are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeExplanation
`ANONYMOUS_IP` - The IP address belongs to an anonymous network. See the object at - `/ip_address/traits` for more details. -
`BILLING_POSTAL_VELOCITY` - Many different billing postal codes have been seen on this IP - address. -
`EMAIL_VELOCITY` - Many different email addresses have been seen on this IP address. -
`HIGH_RISK_DEVICE` - A high risk device was seen on this IP address. -
`HIGH_RISK_EMAIL` - A high risk email address was seen on this IP address in your past - transactions. -
`ISSUER_ID_NUMBER_VELOCITY` - Many different issuer ID numbers have been seen on this IP address. -
`MINFRAUD_NETWORK_ACTIVITY` - Suspicious activity has been seen on this IP address across minFraud - customers. -
- - [Learn how to use IP risk reasons for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408418812827-IP-Risk-Reasons) - -
- - - This field provides an explanation of the reason, as seen in the table - above. The explanation text may change at any time and should not be matched - against. - - [Learn how to use IP risk reasons for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408418812827-IP-Risk-Reasons) - - -
diff --git a/content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReasons.mdx b/content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReasons.mdx deleted file mode 100644 index d2a3e5f7e..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseIpAddressRiskReasons.mdx +++ /dev/null @@ -1,14 +0,0 @@ -import responseJson from '../_examples/response'; - - - This array contains [IP Address Risk Reason objects](#schema--response--ip-address--risk-reason) - identifying the reasons why the IP address received the associated risk. - -[Learn how to use IP risk reasons for risk analysis on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408418812827-IP-Risk-Reasons) - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseRiskMultiplierReason.mdx b/content/minfraud/api-documentation/_schemas/ResponseRiskMultiplierReason.mdx deleted file mode 100644 index 694f4f198..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseRiskMultiplierReason.mdx +++ /dev/null @@ -1,215 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains the reason for the multiplier. - - - The machine-readable code for the risk reason. Although more - codes may be added in the future, the current codes are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeReason
`BROWSER_LANGUAGE` - Riskiness of the browser user-agent and language associated with the request. -
`BUSINESS_ACTIVITY` - Riskiness of business activity associated with the request. -
`COUNTRY` - Riskiness of the country associated with the request. -
`CUSTOMER_ID` - Riskiness of a customer's activity. -
`EMAIL_DOMAIN` - Riskiness of email domain. -
`EMAIL_DOMAIN_NEW` - Riskiness of newly-sighted email domain. -
`EMAIL_ADDRESS_NEW` - Riskiness of newly-sighted email address. -
`EMAIL_LOCAL_PART` - Riskiness of the local part of the email address. -
`EMAIL_VELOCITY` - Velocity on email - many requests on same email over short period of time. -
`ISSUER_ID_NUMBER_COUNTRY_MISMATCH` - Riskiness of the country mismatch between IP, billing, shipping and IIN country. -
`ISSUER_ID_NUMBER_ON_SHOP_ID` - Risk of Issuer ID Number for the shop ID. -
`ISSUER_ID_NUMBER_LAST_DIGITS_ACTIVITY` - Riskiness of many recent requests and previous high-risk requests on the IIN and last digits of the credit card. -
`ISSUER_ID_NUMBER_SHOP_ID_VELOCITY` - Risk of recent Issuer ID Number activity for the shop ID. -
`INTRACOUNTRY_DISTANCE`Risk of distance between IP, billing, and shipping location.
`ANONYMOUS_IP`Risk due to IP being an Anonymous IP.
`IP_BILLING_POSTAL_VELOCITY`Velocity of distinct billing postal code on IP address.
`IP_EMAIL_VELOCITY`Velocity of distinct email address on IP address.
`IP_HIGH_RISK_DEVICE`High-risk device sighted on IP address.
`IP_ISSUER_ID_NUMBER_VELOCITY`Velocity of distinct IIN on IP address.
`IP_ACTIVITY`Riskiness of IP based on minFraud network activity.
`LANGUAGE`Riskiness of browser language.
`MAX_RECENT_EMAIL`Riskiness of email address based on past minFraud risk scores on email.
`MAX_RECENT_PHONE`Riskiness of phone number based on past minFraud risk scores on phone.
`MAX_RECENT_SHIP`Riskiness of email address based on past minFraud risk scores on ship address.
`MULTIPLE_CUSTOMER_ID_ON_EMAIL`Riskiness of email address having many customer IDs.
`ORDER_AMOUNT`Riskiness of the order amount.
`ORG_DISTANCE_RISK`Risk of ISP and distance between billing address and IP location.
`PHONE`Riskiness of the phone number or related numbers.
`CART`Riskiness of shopping cart contents.
`TIME_OF_DAY`Risk due to local time of day.
`TRANSACTION_REPORT_EMAIL`Risk due to transaction reports on the email address.
`TRANSACTION_REPORT_IP`Risk due to transaction reports on the IP address.
`TRANSACTION_REPORT_PHONE`Risk due to transaction reports on the phone number.
`TRANSACTION_REPORT_SHIP`Risk due to transaction reports on the shipping address.
`EMAIL_ACTIVITY`Riskiness of the email address based on minFraud network activity.
`PHONE_ACTIVITY`Riskiness of the phone number based on minFraud network activity.
`SHIP_ACTIVITY`Riskiness of ship address based on minFraud network activity.
- -
- - - The human-readable description of the risk reason. - -
diff --git a/content/minfraud/api-documentation/_schemas/ResponseRiskReason.mdx b/content/minfraud/api-documentation/_schemas/ResponseRiskReason.mdx deleted file mode 100644 index ab387a261..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseRiskReason.mdx +++ /dev/null @@ -1,31 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains risk score reasons for a given transaction that change the risk score significantly. - - - The factor by which the risk score is increased (if the value is greater than 1) or decreased (if the value is less than 1) for given risk reason(s). Multipliers greater than 1.5 and less than 0.66 are considered significant and lead to risk reason(s) being present. - - - - This array contains objects that describe one of the reasons for the multiplier. - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseRiskReasons.mdx b/content/minfraud/api-documentation/_schemas/ResponseRiskReasons.mdx deleted file mode 100644 index 64a0b022d..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseRiskReasons.mdx +++ /dev/null @@ -1,24 +0,0 @@ -import responseJson from '../_examples/response'; - - - - The risk reasons output codes and reasons are currently in beta and are subject to change. - These outputs are being actively developed and tested, and may undergo modifications that could impact their structure, format, and content. - While we strive to maintain stability, we recommend that you use these beta outputs with caution and avoid relying on them for critical applications. - Your feedback is valuable and will help us improve the final release. - - -This array contains -[risk score reason objects](#schema--response--risk-score-reason). Risk score -reasons are usually only returned for medium to high risk transactions. If there -were no significant changes to the risk score due to these reasons, then this -array will not be present in the response. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseShippingAddress.mdx b/content/minfraud/api-documentation/_schemas/ResponseShippingAddress.mdx deleted file mode 100644 index 91f86ec0c..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseShippingAddress.mdx +++ /dev/null @@ -1,115 +0,0 @@ -import responseJson from '../_examples/response'; - - - - This field is `true` if the shipping address is an address associated with - fraudulent transactions. The field is `false` when the address is not - associated with increased risk. The key will only be present when a - shipping address is provided. - - [Learn more about the flag for high risk shipping addresses on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TQP51E294G9ANGEHPC9ZY) - - - - - This field is `true` if the postal code provided with the address is in the - city for the address. The field is `false` when the postal code is not in - the city. The key will only be present when a billing postal code, city, - and country have been provided. - - We use [GeoNames data](https://www.geonames.org/postal-codes/postal-codes-us.html) - for the postal-city match, which uses the [preferred place name](https://en.wikipedia.org/wiki/ZIP_Code#Preferred_place_names:_ZIP_Codes_and_previous_zoning_lines) - for a US ZIP code. [Alternative place names](https://en.wikipedia.org/wiki/ZIP_Code#Preferred_place_names:_ZIP_Codes_and_previous_zoning_lines) - for US ZIP codes may not trigger a match for this field. - - [Learn how to use the postal to city check for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TV1Z2BRWCHVBK1ZE8276E) - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - latitude associated with the address. - - - **Latitude and longitude are not precise and should not be used to - identify a particular street address or household.** - - - - - - The approximate [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) - longitude associated with the address. - - - **Latitude and longitude are not precise and should not be used to - identify a particular street address or household.** - - - - - - The distance in kilometers from the address to the IP location. We fall back - to country or subdivision information if we do not have postal or city - information for an IP address, which may lead to inaccurate distance - calculations. - - [Learn how to use the IP geolocation to address distance for risk analysis - on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVDXWSBQR55FJ0K2KWGJQ) - - - - - The distance in kilometers from the shipping address to billing address. We - fall back to country or subdivision information if we do not have postal or - city information for an IP address, which may lead to inaccurate distance - calculations. - - [Learn how to use the shipping to billing address distance for risk analysis - on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TREMWDMHSB6EW41XX1A0Y) - - - - - This field is `true` if the address is in the IP country. The field is - `false` when the address is not in the IP country. If the IP address could - not be geolocated or no billing address was provided, the field will not be - included in the response. - - [Learn how to use the IP location to country check for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408737039515-Billing-and-Shipping-Address-Risk-Data#h_01FN6TVDXWSBQR55FJ0K2KWGJQ) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseShippingPhone.mdx b/content/minfraud/api-documentation/_schemas/ResponseShippingPhone.mdx deleted file mode 100644 index 901e292df..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseShippingPhone.mdx +++ /dev/null @@ -1,36 +0,0 @@ -import responseJson from '../_examples/response'; - - - - A two-character [ISO 3166-1](https://en.wikipedia.org/wiki/ISO_3166-1) country code for the country associated with the shipping phone number. - - - - The name of the original network operator associated with the shipping phone number. This field does not reflect phone numbers that have been ported from the original operator to another, nor does it identify [mobile virtual network operators](https://en.wikipedia.org/wiki/Mobile_virtual_network_operator). - - - - One of the following values: `fixed` or `mobile`. Additional values may be added in the future. - - - - This is `true` if the shipping phone number is a Voice over Internet Protocol (VoIP) number allocated by a regulator. It is `false` if the shipping phone number is not a VoIP number allocated by a regulator. The key is only present when a valid shipping phone number has been provided and we have data for it. - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseSubscores.mdx b/content/minfraud/api-documentation/_schemas/ResponseSubscores.mdx deleted file mode 100644 index 7b004c991..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseSubscores.mdx +++ /dev/null @@ -1,338 +0,0 @@ -import responseJson from '../_examples/response'; - - - This object contains risk factor scores for many of the individual components - that are used in calculating the `risk_score`. [Learn more about risk factor - scores on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408382645915-Risk-Factor-Scores) - -This object is only included with minFraud Factors. -[Learn more about the differences between the minFraud services on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4407833140123-Compare-the-minFraud-Services) - - - The risk associated with the AVS result. If present, this is a value in the range 0.01 to 99. - - - - - The risk associated with the billing address. If present, this is a value in - the range 0.01 to 99. - - [Learn how to use the billing address risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973621019-Billing-and-Shipping-Risk-Scores#h_01FN6R69DEYJREHS1XEGGMZP1Z) - - - - - The risk associated with the distance between the billing address and the - location for the given IP address. If present, this is a value in the range - 0.01 to 99. - - [Learn how to use the billing address distance risk score for risk analysis - on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973621019-Billing-and-Shipping-Risk-Scores#h_01FN6R6NKC6EV11YECN55R32FB) - - - - - The risk associated with the browser attributes such as the `User-Agent` and - `Accept-Language`. If present, this is a value in the range 0.01 to 99. - - [Learn how to use the browser risk score for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408382525851-Device-Risk-Scores#h_01FN6HFD5KWFEWANTE1WYS1HBY) - - - - - Risk of IP address based on the number of chargebacks and high risk activity - sighted on your account and shop ID from similar IP networks. This is only - available to - users [sending chargeback data to MaxMind](/minfraud/report-a-transaction). - If present, this is a value in the range 0.01 to 99. - - [Learn how to use the chargeback risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4408382525851-Device-Risk-Scores#h_01FN6HEPAK6034Z03NJCQ4F8EK) - - - - - The risk associated with the country the transaction originated from. If - present, this is a value in the range 0.01 to 99. - - [Learn how to use the country risk score for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408382525851#h_01G1EBAN6V6E3EFHC4SC3J9K9M) - - - - - The risk associated with the combination of IP country, card issuer country, - billing country, and shipping country. If present, this is a value in the - range 0.01 to 99. - - [Learn how to use the country mismatch risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973728667-Order-Detail-Risk-Scores#h_01FN6RDP31Y1ST71YB7W58RFRS) - - - - - The risk associated with the CVV result. If present, this is a value in the - range 0.01 to 99. - - [Learn how to use the CVV result risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410743622043-Credit-Card-Risk-Scores#h_01FN6RANC2E9Z6179XGNSNDWYJ) - - - - - The risk associated with the device. If present, this is a value in the - range 0.01 to 99. - - You must have device tracking enabled on your site to receive this risk - factor score. [Learn more about device tracking on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4407973175451) - - [Learn how to use the device risk score for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4408382525851-Device-Risk-Scores#h_01FN6HF0G2CJ5T15H3GJHNQ7XQ) - - - - - The risk associated with the particular email address. If present, this is a - value in the range 0.01 to 99. - - [Learn how to use the email risk score for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4410757081243-Email-Risk-Scores#h_01FN6RDP31Y1ST71YB7W58RFRS) - - - - - The general risk associated with the email domain. If present, this is a - value in the range 0.01 to 99. - - [Learn how to use the email domain risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410757081243-Email-Risk-Scores#h_01FN6RE4TQ10DXYDG6C1QF6X9Y) - - - - - The risk associated with the email address local part (the part of the - email address before the @ symbol). If present, this is a value in the - range 0.01 to 99. - - [Learn how to use the email local part risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410757081243-Email-Risk-Scores#h_01FN6REK9CWDR9V8NQ4WQPTGAD) - - - - - **This field has been deprecated.** Please use the `email_address` risk - factor score instead. - - - - **This field has been deprecated.** Please use `risk_score` instead. - - - - The risk associated with the particular issuer ID number (IIN) given the - billing location and the history of usage of the IIN on your account and - shop ID. If present, this is a value in the range 0.01 to 99. - - [Learn how to use the IIN risk score for risk analysis on our Knowledge - Base.](https://support.maxmind.com/hc/en-us/articles/4410743622043-Credit-Card-Risk-Scores#h_01FN6RA2R69ZTGTS87VKVQ7F7G) - - - - - The risk associated with the particular order amount for your account and - shop ID. If present, this is a value in the range 0.01 to 99. - - [Learn how to use the order amount risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973728667-Order-Detail-Risk-Scores#h_01FN6RE4TQ10DXYDG6C1QF6X9Y) - - - - - The risk associated with the particular phone number. If present, this is a - value in the range 0.01 to 99. - - [Learn how to use the phone number risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973621019-Billing-and-Shipping-Risk-Scores#h_01FN6R7RDDBA09RJSRKDKSC1NJ) - - - - - The risk associated with the shipping address. If present, this is a value - in the range 0.01 to 99. - - [Learn how to use the shipping address risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973621019-Billing-and-Shipping-Risk-Scores#h_01FN6R70AZHQGPME189XTH2SZW) - - - - - The risk associated with the distance between the shipping address and the - location for the given IP address. If present, this is a value in the range - 0.01 to 99. - - [Learn how to use the shipping address distance risk score for risk analysis - on our Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973621019-Billing-and-Shipping-Risk-Scores#h_01FN6R7BQJAVT4KZZTK9Y3HBG6) - - - - - The risk associated with the local time of day of the transaction in the IP - address location. If present, this is a value in the range 0.01 to 99. - - [Learn how to use the time of day risk score for risk analysis on our - Knowledge Base.](https://support.maxmind.com/hc/en-us/articles/4410973728667-Order-Detail-Risk-Scores#h_01FN6REK9CWDR9V8NQ4WQPTGAD) - - - diff --git a/content/minfraud/api-documentation/_schemas/ResponseWarning.mdx b/content/minfraud/api-documentation/_schemas/ResponseWarning.mdx deleted file mode 100644 index 5d5d0d3e7..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseWarning.mdx +++ /dev/null @@ -1,193 +0,0 @@ -import responseJson from '../_examples/response'; - - - - This value is a machine-readable code identifying the warning. Although more - codes may be added in the future, the current codes are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeDescription
- `BILLING_CITY_NOT_FOUND` - - The billing city could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `BILLING_COUNTRY_MISSING` - - Billing address information was provided without providing a billing - country. This may impact our ability to provide accurate distance calculations. -
- `BILLING_COUNTRY_NOT_FOUND` - - The billing country could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `BILLING_POSTAL_NOT_FOUND` - - The billing postal could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `BILLING_REGION_NOT_FOUND` - - The billing region could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `EMAIL_ADDRESS_UNUSABLE` - - The email address entered is likely incorrect due to an integration issue. - To avoid false positives, it has not been used in scoring. Check how you - are passing your [email address inputs](/minfraud/api-documentation/requests#schema--request--email). -
- `INPUT_INVALID` - - The value associated with the key does not meet the required - constraints, e.g., "United States" in a field that requires a - two-letter country code. -
- `INPUT_UNKNOWN` - - An unknown key was encountered in the request body. -
- `IP_ADDRESS_INVALID` - - The IP address supplied is not a valid IPv4 or IPv6 address. -
- `IP_ADDRESS_NOT_FOUND` - - The IP address could not be geolocated. -
- `IP_ADDRESS_RESERVED` - - The IP address supplied is in a reserved network. -
- `SHIPPING_CITY_NOT_FOUND` - - The shipping city could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `SHIPPING_COUNTRY_MISSING` - - Shipping address information was provided without providing a - shipping country. This may impact our ability to provide accurate distance calculations. -
- `SHIPPING_COUNTRY_NOT_FOUND` - - The shipping country could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `SHIPPING_POSTAL_NOT_FOUND` - - The shipping postal could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- `SHIPPING_REGION_NOT_FOUND` - - The shipping region could not be found in our database. - This may impact our ability to provide accurate distance calculations. -
- -
- - - This field provides a human-readable explanation of the warning. The - description may change at any time and should not be matched against. - - - - A [JSON Pointer](https://tools.ietf.org/html/rfc6901) to the input field - that the warning is associated with. For instance, if the warning was about - the billing city, this would be `/billing/city`. If it was for the price in - the second shopping cart item, it would be `/shopping_cart/1/price` - -
diff --git a/content/minfraud/api-documentation/_schemas/ResponseWarnings.mdx b/content/minfraud/api-documentation/_schemas/ResponseWarnings.mdx deleted file mode 100644 index eda53be7f..000000000 --- a/content/minfraud/api-documentation/_schemas/ResponseWarnings.mdx +++ /dev/null @@ -1,12 +0,0 @@ -import responseJson from '../_examples/response'; - - - This array contains [warning objects](#schema--response--warning) detailing - issues with the request that was sent such as invalid or unknown inputs. It is - highly recommended that you check this array for issues when integrating the - web service. - diff --git a/content/minfraud/api-documentation/_schemas/index.mdx b/content/minfraud/api-documentation/_schemas/index.mdx deleted file mode 100644 index 8d5b6afef..000000000 --- a/content/minfraud/api-documentation/_schemas/index.mdx +++ /dev/null @@ -1,36 +0,0 @@ -export { default as Request } from './Request.mdx'; -export { default as RequestDevice } from './RequestDevice.mdx'; -export { default as RequestEvent } from './RequestEvent.mdx'; -export { default as RequestAccount } from './RequestAccount.mdx'; -export { default as RequestEmail } from './RequestEmail.mdx'; -export { default as RequestBilling } from './RequestBilling.mdx'; -export { default as RequestShipping } from './RequestShipping.mdx'; -export { default as RequestPayment } from './RequestPayment.mdx'; -export { default as RequestCreditCard } from './RequestCreditCard.mdx'; -export { default as RequestOrder } from './RequestOrder.mdx'; -export { default as RequestShoppingCart} from './RequestShoppingCart.mdx'; -export { default as RequestShoppingCartItem } from './RequestShoppingCartItem.mdx'; -export { default as RequestCustomInputs } from './RequestCustomInputs.mdx'; - -export { default as Response } from './Response.mdx'; -export { default as ResponseIpAddress } from './ResponseIpAddress.mdx'; -export { default as ResponseIpAddressCountry } from './ResponseIpAddressCountry.mdx'; -export { default as ResponseIpAddressLocation } from './ResponseIpAddressLocation.mdx'; -export { default as ResponseIpAddressRiskReasons } from './ResponseIpAddressRiskReasons.mdx'; -export { default as ResponseIpAddressRiskReason } from './ResponseIpAddressRiskReason.mdx'; -export { default as ResponseCreditCard } from './ResponseCreditCard'; -export { default as ResponseCreditCardIssuer } from './ResponseCreditCardIssuer'; -export { default as ResponseDevice } from './ResponseDevice'; -export { default as ResponseEmail } from './ResponseEmail'; -export { default as ResponseEmailDomain } from './ResponseEmailDomain'; -export { default as ResponseShippingAddress } from './ResponseShippingAddress'; -export { default as ResponseShippingPhone } from './ResponseShippingPhone'; -export { default as ResponseBillingAddress } from './ResponseBillingAddress'; -export { default as ResponseBillingPhone } from './ResponseBillingPhone'; -export { default as ResponseDisposition } from './ResponseDisposition'; -export { default as ResponseRiskReasons } from './ResponseRiskReasons'; -export { default as ResponseRiskReason } from './ResponseRiskReason'; -export { default as ResponseRiskMultiplierReason } from './ResponseRiskMultiplierReason'; -export { default as ResponseSubscores } from './ResponseSubscores'; -export { default as ResponseWarnings } from './ResponseWarnings'; -export { default as ResponseWarning } from './ResponseWarning'; diff --git a/content/minfraud/normalizing-email-addresses-for-minfraud.mdx b/content/minfraud/normalizing-email-addresses-for-minfraud.md similarity index 100% rename from content/minfraud/normalizing-email-addresses-for-minfraud.mdx rename to content/minfraud/normalizing-email-addresses-for-minfraud.md diff --git a/content/minfraud/whats-new-in-minfraud-score-and-minfraud-insights.mdx b/content/minfraud/whats-new-in-minfraud-score-and-minfraud-insights.md similarity index 97% rename from content/minfraud/whats-new-in-minfraud-score-and-minfraud-insights.mdx rename to content/minfraud/whats-new-in-minfraud-score-and-minfraud-insights.md index d069127c5..8d84bdbb9 100644 --- a/content/minfraud/whats-new-in-minfraud-score-and-minfraud-insights.mdx +++ b/content/minfraud/whats-new-in-minfraud-score-and-minfraud-insights.md @@ -207,8 +207,8 @@ The following outputs have been added. - `number_type` - `is_voip` -\* Latitude and longitude are not precise and should not be used to identify a -particular street address or household. +\* Latitude and longitude are not precise and should not be used to identify a +particular street address or household. ### Deprecated Outputs diff --git a/hugo.toml b/hugo.toml index 6ebddd5ce..da5892c4a 100644 --- a/hugo.toml +++ b/hugo.toml @@ -141,6 +141,16 @@ title = 'MaxMind' pageRef = '/geoip/docs/web-services/responses' parent = 'Web Services Documentation' weight = 20 + [[menus.geoip]] + name = 'Sandbox Environment' + pageRef = '/geoip/docs/web-services/sandbox-environment' + parent = 'Web Services Documentation' + weight = 30 + [[menus.geoip]] + name = 'Legacy Web Services' + pageRef = '/geoip/docs/web-services/legacy' + parent = 'Web Services Documentation' + weight = 40 [[menus.geoip]] name = 'Database Documentation' pageRef = '/geoip/docs/databases' From 2be5547d28390ce057d9957914449580cd2bdd55 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:30:20 -0400 Subject: [PATCH 14/24] Update github workflow --- .github/workflows/codeql-analysis.yml | 56 ------ .github/workflows/hugo.yml | 23 +++ .github/workflows/production.yml | 217 --------------------- .github/workflows/staging.yml | 261 -------------------------- 4 files changed, 23 insertions(+), 534 deletions(-) delete mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/hugo.yml delete mode 100644 .github/workflows/production.yml delete mode 100644 .github/workflows/staging.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 814430351..000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: "Code scanning - action" - -on: - push: - branches: - - main - pull_request: - schedule: - - cron: '0 11 * * 3' - -jobs: - CodeQL-Build: - - runs-on: ubuntu-latest - - permissions: - security-events: write - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - # Override language selection by uncommenting this and choosing your languages - # with: - # languages: go, javascript, csharp, python, cpp, java - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml new file mode 100644 index 000000000..53300e172 --- /dev/null +++ b/.github/workflows/hugo.yml @@ -0,0 +1,23 @@ +name: Hugo + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + + - name: Setup Hugo + uses: peaceiris/actions-hugo@v3 + with: + hugo-version: 'latest' + extended: true diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml deleted file mode 100644 index 10dffbce9..000000000 --- a/.github/workflows/production.yml +++ /dev/null @@ -1,217 +0,0 @@ -name: Production - -on: - push: - branches: - - main - -env: - FIREBASE_PROJECT_ID: mm-dev-site-production - FIREBASE_SERVICE_ACCOUNT: "${{ secrets.PRODUCTION_FIREBASE_SERVICE_ACCOUNT }}" - -concurrency: production_deploy - -jobs: - cache-keys: - name: Cache keys - runs-on: ubuntu-latest - - outputs: - build: build-${{ steps.build.outputs.hash }}-v2 - node-modules: node-modules-${{ steps.node-modules.outputs.hash }}-v1 - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - id: build - run: echo "::set-output name=hash::${{ hashFiles('bin/**', 'content/**', 'firebase/**', 'functions/src/**', 'src/**', 'static/**', '**/package.json', '**/package-lock.json') }}" - - - id: node-modules - run: echo "::set-output name=hash::${{ hashFiles('**/package-lock.json') }}" - - build: - needs: cache-keys - name: Build - runs-on: ubuntu-latest - - outputs: - is-cached-build: ${{ steps.cached-build.outputs.cache-hit }} - - steps: - - name: Check Out repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - id: cache-node-modules - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - if: steps.cache-node-modules.outputs.cache-hit != 'true' - name: Install dependencies - run: npm ci - - - name: Get cached build - id: cached-build - uses: actions/cache@v3 - with: - path: | - functions/lib - public - firebase.json - key: ${{ needs.cache-keys.outputs.build }} - - - if: steps.cached-build.outputs.cache-hit != 'true' - name: Build - env: - GATSBY_URL: https://dev.maxmind.com - run: npm run build - - test-unit: - if: needs.build.outputs.is-cached-build != 'true' - name: Test – Unit - needs: [cache-keys, build] - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Run unit tests - run: npm run test:unit - - deploy-hosting: - name: Deploy – Hosting - needs: [cache-keys, build, test-unit] - # Only run this job if test jobs either ran successfully or were skipped - # because a previously tested build was cached. - # Inspired by https://github.com/actions/runner/issues/491#issuecomment-850884422 - if: | - always() && - (needs.test-unit.result == 'success' || needs.test-unit.result == 'skipped') - runs-on: ubuntu-latest - - permissions: - checks: write - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached build - uses: actions/cache@v3 - with: - path: | - functions/lib - public - firebase.json - key: ${{ needs.cache-keys.outputs.build }} - - - name: Deploy Firebase live channel - uses: FirebaseExtended/action-hosting-deploy@4d0d0023f1d92b9b7d16dda64b3d7abd2c98974b # v0 - with: - repoToken: "${{ secrets.GITHUB_TOKEN }}" - firebaseServiceAccount: "${{ env.FIREBASE_SERVICE_ACCOUNT }}" - projectId: ${{ env.FIREBASE_PROJECT_ID }} - channelId: live - - deploy-functions: - name: Deploy - Functions - needs: [cache-keys, build, test-unit] - # Only run this job if test jobs either ran successfully or were skipped - # because a previously tested build was cached. - # Inspired by https://github.com/actions/runner/issues/491#issuecomment-850884422 - if: | - always() && - (needs.test-unit.result == 'success' || needs.test-unit.result == 'skipped') - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached build - uses: actions/cache@v3 - with: - path: | - functions/lib - public - firebase.json - key: ${{ needs.cache-keys.outputs.build }} - - - name: Set up Google Cloud SDK - uses: google-github-actions/setup-gcloud@ee9693ff89cdf73862b8a13988f6a71070e8fc58 # v0.2.1 - with: - project_id: ${{ env.FIREBASE_PROJECT_ID }} - service_account_key: "${{ env.FIREBASE_SERVICE_ACCOUNT }}" - export_default_credentials: true - - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Deploy all other Firebase resources - run: npm exec -- firebase deploy --except hosting --project ${{ env.FIREBASE_PROJECT_ID }} --force - - test-e2e: - name: Test – End-to-end - needs: [cache-keys, deploy-hosting, deploy-functions] - # Force this step to run after successful deployment jobs - if: | - always() && - needs.deploy-hosting.result == 'success' && - needs.deploy-functions.result == 'success' - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Run end-to-end tests - env: - E2E_TARGET_URL: https://dev.maxmind.com - run: npm run test:e2e diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml deleted file mode 100644 index 71959be3f..000000000 --- a/.github/workflows/staging.yml +++ /dev/null @@ -1,261 +0,0 @@ -name: Staging - -on: - pull_request: - push: - -env: - FIREBASE_CHANNEL_ID: "pr-${{github.event.number}}" - FIREBASE_PROJECT_ID: mm-dev-site-staging - FIREBASE_SERVICE_ACCOUNT: "${{ secrets.STAGING_FIREBASE_SERVICE_ACCOUNT }}" - -jobs: - cache-keys: - name: Setup – Cache keys - runs-on: ubuntu-latest - - outputs: - build: build-${{ steps.build.outputs.hash }}-v2 - dot-cache: dot-cache-${{ github.event.number }}-v1 - node-modules: node-modules-${{ steps.node-modules.outputs.hash }}-v1 - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - id: build - run: echo "::set-output name=hash::${{ hashFiles('bin/**', 'content/**', 'firebase/**', 'functions/src/**', 'src/**', 'static/**', 'test/**', '**/package.json', '**/package-lock.json') }}" - - - id: node-modules - run: echo "::set-output name=hash::${{ hashFiles('**/package-lock.json') }}" - - build: - name: Build - needs: cache-keys - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - uses: actions/cache@v3 - id: cache-node-modules - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Check that package-lock.json is valid JSON - run: jq empty package-lock.json - - - if: steps.cache-node-modules.outputs.cache-hit != 'true' - name: Install dependencies - run: npm ci - - - name: Get cached build - id: cached-build - uses: actions/cache@v3 - with: - path: | - functions/lib - public - firebase.json - key: ${{ needs.cache-keys.outputs.build }} - - - name: Get .cache cache - uses: actions/cache@v3 - with: - path: | - .cache - key: ${{ needs.cache-keys.outputs.dot-cache }} - - - if: steps.cached-build.outputs.cache-hit != 'true' - name: Build - env: - GATSBY_URL: https://dev.maxmind.com - run: npm run build - - test-unit: - name: Test – Unit - needs: [cache-keys, build] - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Run unit tests - run: npm run test:unit - - test-lint: - name: Test – Lint - needs: [cache-keys, build] - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Run linters - run: npm run lint - - deploy-hosting: - name: Deploy – Hosting - needs: [cache-keys, build] - runs-on: ubuntu-latest - # Requires access to our secrets. - if: ${{ github.repository_owner == 'maxmind' && github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false }} - - outputs: - hosting-url: ${{ steps.deploy-preview-channel.outputs.details_url }} - - permissions: - checks: write - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached build - uses: actions/cache@v3 - with: - path: | - functions/lib - public - firebase.json - key: ${{ needs.cache-keys.outputs.build }} - - - name: Deploy Firebase preview channel - id: deploy-preview-channel - uses: FirebaseExtended/action-hosting-deploy@4d0d0023f1d92b9b7d16dda64b3d7abd2c98974b # v0 - with: - repoToken: "${{ secrets.GITHUB_TOKEN }}" - firebaseServiceAccount: "${{ env.FIREBASE_SERVICE_ACCOUNT }}" - expires: 7d - projectId: "${{ env.FIREBASE_PROJECT_ID }}" - channelId: "${{ env.FIREBASE_CHANNEL_ID }}" - env: - FIREBASE_CLI_PREVIEWS: hostingchannels - - - name: Update robots and sitemap files for staging environments - env: - FIND_AND_REPLACE: s|https://dev.maxmind.com|${{ steps.deploy-preview-channel.outputs.details_url }}|g - run: | - sed -i "s/Allow:/Disallow:/g" public/robots.txt - sed -i "$FIND_AND_REPLACE" public/robots.txt - sed -i "$FIND_AND_REPLACE" public/sitemap.xml - sed -i "$FIND_AND_REPLACE" public/sitemap-pages.xml - - - name: Deploy updated files staging environment files - uses: FirebaseExtended/action-hosting-deploy@4d0d0023f1d92b9b7d16dda64b3d7abd2c98974b # v0 - with: - repoToken: "${{ secrets.GITHUB_TOKEN }}" - firebaseServiceAccount: "${{ env.FIREBASE_SERVICE_ACCOUNT }}" - expires: 30d - projectId: "${{ env.FIREBASE_PROJECT_ID }}" - channelId: "${{ env.FIREBASE_CHANNEL_ID }}" - env: - FIREBASE_CLI_PREVIEWS: hostingchannels - - deploy-functions: - name: Deploy – Functions - needs: [cache-keys, build] - runs-on: ubuntu-latest - # Requires access to our secrets. - if: ${{ github.repository_owner == 'maxmind' && github.actor != 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false }} - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached build - uses: actions/cache@v3 - with: - path: | - functions/lib - public - firebase.json - key: ${{ needs.cache-keys.outputs.build }} - - - name: Set up Google Cloud SDK - uses: google-github-actions/setup-gcloud@ee9693ff89cdf73862b8a13988f6a71070e8fc58 # v0.2.1 - with: - project_id: ${{ env.FIREBASE_PROJECT_ID }} - service_account_key: ${{ env.FIREBASE_SERVICE_ACCOUNT }} - export_default_credentials: true - - # Dependencies are needed here to run `npm exec -- firebase` command - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Deploy all other Firebase resources - run: npm exec -- firebase deploy --except hosting --project ${{ env.FIREBASE_PROJECT_ID }} --force - - test-e2e: - name: Test – End-to-end - needs: [cache-keys, deploy-hosting, deploy-functions] - runs-on: ubuntu-latest - - steps: - - name: Check Out Repo - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: '20' - - - name: Get cached dependencies - uses: actions/cache@v3 - with: - path: | - node_modules - functions/node_modules - key: ${{ needs.cache-keys.outputs.node-modules }} - - - name: Run end-to-end tests - env: - E2E_TARGET_URL: ${{ needs.deploy-hosting.outputs.hosting-url }} - run: npm run test:e2e From c1fe546647f78eab4cc2a1b5efffca672d5052ce Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:31:13 -0400 Subject: [PATCH 15/24] Remove old gatsby files --- src/assets/index.ts | 23 - src/assets/svgs/geoip-icon.svg | 38 - src/assets/svgs/icon-ccpa-opt-out.svg | 33 - src/assets/svgs/maxmind-footer-logo.svg | 17 - src/assets/svgs/maxmind-logo.svg | 39 - src/assets/svgs/minfraud-icon.svg | 16 - src/assets/svgs/under-construction.svg | 1 - src/baseQuery.ts | 29 - src/components/Alert.module.scss | 85 - src/components/Alert.tsx | 77 - src/components/CsvBlockTable.tsx | 565 --- src/components/CsvExampleFiles.tsx | 47 - src/components/CsvLocationTable.tsx | 454 -- src/components/DatabaseChanges.tsx | 48 - src/components/DatabaseSizes.tsx | 95 - src/components/Example.module.scss | 29 - src/components/Example.tsx | 63 - .../Layout/AccessibilityNav.module.scss | 54 - src/components/Layout/AccessibilityNav.tsx | 70 - src/components/Layout/Footer.module.scss | 247 - src/components/Layout/Footer.tsx | 306 -- src/components/Layout/Header.module.scss | 201 - src/components/Layout/Header.tsx | 104 - src/components/Layout/Layout.module.scss | 82 - src/components/Layout/Layout.tsx | 133 - src/components/Layout/SearchBar.module.scss | 72 - src/components/Layout/SearchBar.tsx | 110 - src/components/Layout/Seo.tsx | 129 - src/components/Layout/Sidebar.module.scss | 248 - src/components/Layout/Sidebar.tsx | 122 - src/components/Layout/index.ts | 1 - src/components/Link.tsx | 17 - src/components/LinkButton.module.scss | 41 - src/components/LinkButton.tsx | 43 - .../LinkGroup/LinkGroup.module.scss | 94 - src/components/LinkGroup/LinkGroup.tsx | 59 - .../LinkGroup/LinkGroupCard.module.scss | 100 - src/components/LinkGroup/LinkGroupCard.tsx | 67 - .../LinkGroup/LinkGroupContainer.module.scss | 3 - .../LinkGroup/LinkGroupContainer.tsx | 29 - src/components/LinkGroup/index.ts | 3 - src/components/Loading.module.scss | 103 - src/components/Loading.tsx | 60 - src/components/Mdx/A.module.scss | 20 - src/components/Mdx/A.tsx | 64 - src/components/Mdx/Blockquote.module.scss | 34 - src/components/Mdx/Blockquote.tsx | 28 - src/components/Mdx/Code.module.scss | 21 - src/components/Mdx/Code.tsx | 24 - src/components/Mdx/Del.module.scss | 4 - src/components/Mdx/Del.tsx | 24 - src/components/Mdx/Em.module.scss | 3 - src/components/Mdx/Em.tsx | 24 - src/components/Mdx/H1.module.scss | 16 - src/components/Mdx/H1.tsx | 24 - src/components/Mdx/H2.module.scss | 7 - src/components/Mdx/H2.tsx | 36 - src/components/Mdx/H3.module.scss | 6 - src/components/Mdx/H3.tsx | 36 - src/components/Mdx/H4.module.scss | 6 - src/components/Mdx/H4.tsx | 36 - src/components/Mdx/H5.module.scss | 6 - src/components/Mdx/H5.tsx | 36 - src/components/Mdx/H6.module.scss | 11 - src/components/Mdx/H6.tsx | 36 - src/components/Mdx/Hr.module.scss | 10 - src/components/Mdx/Hr.tsx | 21 - src/components/Mdx/Img.module.scss | 3 - src/components/Mdx/Img.tsx | 35 - src/components/Mdx/Li.module.scss | 11 - src/components/Mdx/Li.tsx | 24 - src/components/Mdx/Ol.module.scss | 11 - src/components/Mdx/Ol.tsx | 25 - src/components/Mdx/P.module.scss | 8 - src/components/Mdx/P.tsx | 24 - src/components/Mdx/Pre/Button.module.scss | 39 - src/components/Mdx/Pre/Button.tsx | 41 - src/components/Mdx/Pre/Code.dark-theme.css | 274 -- src/components/Mdx/Pre/Code.module.scss | 82 - src/components/Mdx/Pre/Code.tsx | 173 - src/components/Mdx/Pre/Pre.module.scss | 86 - src/components/Mdx/Pre/Pre.tsx | 230 - src/components/Mdx/Pre/Wrapper.module.scss | 9 - src/components/Mdx/Pre/Wrapper.tsx | 32 - src/components/Mdx/Pre/index.ts | 1 - src/components/Mdx/Strong.module.scss | 3 - src/components/Mdx/Strong.tsx | 24 - src/components/Mdx/Table.module.scss | 36 - src/components/Mdx/Table.tsx | 32 - src/components/Mdx/Tbody.tsx | 16 - src/components/Mdx/Td.module.scss | 34 - src/components/Mdx/Td.tsx | 24 - src/components/Mdx/Th.module.scss | 11 - src/components/Mdx/Th.tsx | 31 - src/components/Mdx/Thead.module.scss | 5 - src/components/Mdx/Thead.tsx | 24 - src/components/Mdx/Tr.module.scss | 7 - src/components/Mdx/Tr.tsx | 24 - src/components/Mdx/Ul.module.scss | 11 - src/components/Mdx/Ul.tsx | 24 - src/components/Mdx/index.ts | 46 - src/components/MmdbExampleFiles.tsx | 57 - src/components/ProductIcon.module.scss | 52 - src/components/ProductIcon.tsx | 65 - src/components/ReleaseNote.module.scss | 16 - src/components/ReleaseNote.spec.tsx | 53 - src/components/ReleaseNote.tsx | 75 - src/components/Schema/Footnote.module.scss | 29 - src/components/Schema/Footnote.spec.tsx | 17 - src/components/Schema/Footnote.tsx | 22 - src/components/Schema/GeoIpSchema.spec.tsx | 32 - src/components/Schema/GeoIpSchema.tsx | 35 - .../Schema/GeoIpServiceTags.spec.tsx | 95 - src/components/Schema/GeoIpServiceTags.tsx | 37 - src/components/Schema/MinFraudSchema.spec.tsx | 33 - src/components/Schema/MinFraudSchema.tsx | 36 - .../Schema/MinFraudServiceTags.spec.tsx | 95 - src/components/Schema/MinFraudServiceTags.tsx | 41 - src/components/Schema/Property.module.scss | 166 - src/components/Schema/Property.spec.tsx | 408 -- src/components/Schema/Property.tsx | 228 - src/components/Schema/PropertyValues.ts | 95 - src/components/Schema/Schema.module.scss | 140 - src/components/Schema/Schema.spec.tsx | 159 - src/components/Schema/Schema.tsx | 166 - src/components/Schema/SchemaContext.ts | 15 - src/components/Schema/ServiceTag.module.scss | 30 - src/components/Schema/ServiceTag.spec.tsx | 34 - src/components/Schema/ServiceTag.tsx | 35 - src/components/Schema/Tag.module.scss | 11 - src/components/Schema/Tag.tsx | 32 - src/components/Schema/index.ts | 5 - src/components/Schema/types.d.ts | 19 - src/components/SearchResult.module.scss | 30 - src/components/SearchResult.tsx | 56 - src/components/SystemsStatusIcons.module.scss | 7 - src/components/SystemsStatusIcons.tsx | 19 - src/components/ZipFileContent.tsx | 93 - src/gatsby/gatsby-browser/index.ts | 3 - src/gatsby/gatsby-browser/onClientEntry.ts | 31 - src/gatsby/gatsby-browser/onRouteUpdate.ts | 16 - src/gatsby/gatsby-browser/wrapRootElement.tsx | 27 - .../feeds/createReleaseNotesFeed.ts | 98 - .../feeds/createServerIpAddressesFeed.ts | 48 - src/gatsby/gatsby-config/index.ts | 206 - .../gatsby-config/remark/sectionize.spec.ts | 61 - src/gatsby/gatsby-config/remark/sectionize.ts | 69 - src/gatsby/gatsby-node/createPages.ts | 11 - src/gatsby/gatsby-node/createResolvers.ts | 69 - .../gatsby-node/createSchemaCutomization.ts | 15 - src/gatsby/gatsby-node/index.ts | 5 - src/gatsby/gatsby-node/onCreateNode.ts | 50 - .../gatsby-node/onCreateWebpackConfig.ts | 136 - .../gatsby-node/pages/createMdxPages.ts | 50 - src/gatsby/gatsby-ssr/index.ts | 2 - src/gatsby/gatsby-ssr/replaceRenderer.tsx | 97 - src/gatsby/gatsby-ssr/wrapRootElement.tsx | 27 - src/globals.d.ts | 10 - src/hooks/useActiveHeading.ts | 60 - src/hooks/useIsClient.ts | 26 - src/hooks/useSystemStatus.tsx | 114 - src/images/maxmind-icon.png | Bin 11436 -> 0 bytes src/languages.ts | 235 - src/pages/search-results.module.scss | 91 - src/pages/search-results.tsx | 261 -- src/services/GoogleSearch.ts | 53 - src/store/index.tsx | 62 - src/styles/_reset.scss | 136 - src/styles/_variables.scss | 198 - src/styles/global.scss | 91 - src/templates/Home/Home.module.scss | 76 - src/templates/Home/Home.tsx | 174 - src/templates/Home/Product.module.scss | 211 - src/templates/Home/Product.tsx | 103 - src/templates/Home/index.ts | 1 - src/templates/Home/query.ts | 20 - src/templates/Overview/Overview.module.scss | 121 - src/templates/Overview/Overview.tsx | 80 - src/templates/Overview/index.ts | 1 - src/templates/Overview/query.ts | 29 - src/templates/Page/Page.module.scss | 294 -- src/templates/Page/Page.tsx | 178 - .../Page/ReleaseNotesArchiveList.tsx | 75 - .../Page/TableOfContents.module.scss | 117 - src/templates/Page/TableOfContents.tsx | 119 - src/templates/Page/index.ts | 1 - src/templates/Page/query.ts | 33 - src/types/Item.ts | 22 - src/types/globals/index.d.ts | 38 - src/types/openapi-types/index.d.ts | 30 - src/types/remark/index.d.ts | 1 - src/types/vfile-message/index.d.ts | 4 - src/utils/get-toc-items--direct.fixture.json | 1303 ------ .../get-toc-items--indirect.fixture.json | 4028 ----------------- src/utils/get-toc-items.spec.ts | 160 - src/utils/get-toc-items.ts | 153 - src/utils/json.spec.ts | 191 - src/utils/json.ts | 51 - src/utils/markdown.tsx | 21 - src/utils/openapi.spec.ts | 140 - src/utils/openapi.ts | 35 - src/utils/pagination.spec.ts | 92 - src/utils/pagination.ts | 51 - 203 files changed, 18999 deletions(-) delete mode 100644 src/assets/index.ts delete mode 100644 src/assets/svgs/geoip-icon.svg delete mode 100644 src/assets/svgs/icon-ccpa-opt-out.svg delete mode 100644 src/assets/svgs/maxmind-footer-logo.svg delete mode 100644 src/assets/svgs/maxmind-logo.svg delete mode 100644 src/assets/svgs/minfraud-icon.svg delete mode 100644 src/assets/svgs/under-construction.svg delete mode 100644 src/baseQuery.ts delete mode 100644 src/components/Alert.module.scss delete mode 100644 src/components/Alert.tsx delete mode 100644 src/components/CsvBlockTable.tsx delete mode 100644 src/components/CsvExampleFiles.tsx delete mode 100644 src/components/CsvLocationTable.tsx delete mode 100644 src/components/DatabaseChanges.tsx delete mode 100644 src/components/DatabaseSizes.tsx delete mode 100644 src/components/Example.module.scss delete mode 100644 src/components/Example.tsx delete mode 100644 src/components/Layout/AccessibilityNav.module.scss delete mode 100644 src/components/Layout/AccessibilityNav.tsx delete mode 100644 src/components/Layout/Footer.module.scss delete mode 100644 src/components/Layout/Footer.tsx delete mode 100644 src/components/Layout/Header.module.scss delete mode 100644 src/components/Layout/Header.tsx delete mode 100644 src/components/Layout/Layout.module.scss delete mode 100644 src/components/Layout/Layout.tsx delete mode 100644 src/components/Layout/SearchBar.module.scss delete mode 100644 src/components/Layout/SearchBar.tsx delete mode 100644 src/components/Layout/Seo.tsx delete mode 100644 src/components/Layout/Sidebar.module.scss delete mode 100644 src/components/Layout/Sidebar.tsx delete mode 100644 src/components/Layout/index.ts delete mode 100644 src/components/Link.tsx delete mode 100644 src/components/LinkButton.module.scss delete mode 100644 src/components/LinkButton.tsx delete mode 100644 src/components/LinkGroup/LinkGroup.module.scss delete mode 100644 src/components/LinkGroup/LinkGroup.tsx delete mode 100644 src/components/LinkGroup/LinkGroupCard.module.scss delete mode 100644 src/components/LinkGroup/LinkGroupCard.tsx delete mode 100644 src/components/LinkGroup/LinkGroupContainer.module.scss delete mode 100644 src/components/LinkGroup/LinkGroupContainer.tsx delete mode 100644 src/components/LinkGroup/index.ts delete mode 100644 src/components/Loading.module.scss delete mode 100644 src/components/Loading.tsx delete mode 100644 src/components/Mdx/A.module.scss delete mode 100644 src/components/Mdx/A.tsx delete mode 100644 src/components/Mdx/Blockquote.module.scss delete mode 100644 src/components/Mdx/Blockquote.tsx delete mode 100644 src/components/Mdx/Code.module.scss delete mode 100644 src/components/Mdx/Code.tsx delete mode 100644 src/components/Mdx/Del.module.scss delete mode 100644 src/components/Mdx/Del.tsx delete mode 100644 src/components/Mdx/Em.module.scss delete mode 100644 src/components/Mdx/Em.tsx delete mode 100644 src/components/Mdx/H1.module.scss delete mode 100644 src/components/Mdx/H1.tsx delete mode 100644 src/components/Mdx/H2.module.scss delete mode 100644 src/components/Mdx/H2.tsx delete mode 100644 src/components/Mdx/H3.module.scss delete mode 100644 src/components/Mdx/H3.tsx delete mode 100644 src/components/Mdx/H4.module.scss delete mode 100644 src/components/Mdx/H4.tsx delete mode 100644 src/components/Mdx/H5.module.scss delete mode 100644 src/components/Mdx/H5.tsx delete mode 100644 src/components/Mdx/H6.module.scss delete mode 100644 src/components/Mdx/H6.tsx delete mode 100644 src/components/Mdx/Hr.module.scss delete mode 100644 src/components/Mdx/Hr.tsx delete mode 100644 src/components/Mdx/Img.module.scss delete mode 100644 src/components/Mdx/Img.tsx delete mode 100644 src/components/Mdx/Li.module.scss delete mode 100644 src/components/Mdx/Li.tsx delete mode 100644 src/components/Mdx/Ol.module.scss delete mode 100644 src/components/Mdx/Ol.tsx delete mode 100644 src/components/Mdx/P.module.scss delete mode 100644 src/components/Mdx/P.tsx delete mode 100644 src/components/Mdx/Pre/Button.module.scss delete mode 100644 src/components/Mdx/Pre/Button.tsx delete mode 100644 src/components/Mdx/Pre/Code.dark-theme.css delete mode 100644 src/components/Mdx/Pre/Code.module.scss delete mode 100644 src/components/Mdx/Pre/Code.tsx delete mode 100644 src/components/Mdx/Pre/Pre.module.scss delete mode 100644 src/components/Mdx/Pre/Pre.tsx delete mode 100644 src/components/Mdx/Pre/Wrapper.module.scss delete mode 100644 src/components/Mdx/Pre/Wrapper.tsx delete mode 100644 src/components/Mdx/Pre/index.ts delete mode 100644 src/components/Mdx/Strong.module.scss delete mode 100644 src/components/Mdx/Strong.tsx delete mode 100644 src/components/Mdx/Table.module.scss delete mode 100644 src/components/Mdx/Table.tsx delete mode 100644 src/components/Mdx/Tbody.tsx delete mode 100644 src/components/Mdx/Td.module.scss delete mode 100644 src/components/Mdx/Td.tsx delete mode 100644 src/components/Mdx/Th.module.scss delete mode 100644 src/components/Mdx/Th.tsx delete mode 100644 src/components/Mdx/Thead.module.scss delete mode 100644 src/components/Mdx/Thead.tsx delete mode 100644 src/components/Mdx/Tr.module.scss delete mode 100644 src/components/Mdx/Tr.tsx delete mode 100644 src/components/Mdx/Ul.module.scss delete mode 100644 src/components/Mdx/Ul.tsx delete mode 100644 src/components/Mdx/index.ts delete mode 100644 src/components/MmdbExampleFiles.tsx delete mode 100644 src/components/ProductIcon.module.scss delete mode 100644 src/components/ProductIcon.tsx delete mode 100644 src/components/ReleaseNote.module.scss delete mode 100644 src/components/ReleaseNote.spec.tsx delete mode 100644 src/components/ReleaseNote.tsx delete mode 100644 src/components/Schema/Footnote.module.scss delete mode 100644 src/components/Schema/Footnote.spec.tsx delete mode 100644 src/components/Schema/Footnote.tsx delete mode 100644 src/components/Schema/GeoIpSchema.spec.tsx delete mode 100644 src/components/Schema/GeoIpSchema.tsx delete mode 100644 src/components/Schema/GeoIpServiceTags.spec.tsx delete mode 100644 src/components/Schema/GeoIpServiceTags.tsx delete mode 100644 src/components/Schema/MinFraudSchema.spec.tsx delete mode 100644 src/components/Schema/MinFraudSchema.tsx delete mode 100644 src/components/Schema/MinFraudServiceTags.spec.tsx delete mode 100644 src/components/Schema/MinFraudServiceTags.tsx delete mode 100644 src/components/Schema/Property.module.scss delete mode 100644 src/components/Schema/Property.spec.tsx delete mode 100644 src/components/Schema/Property.tsx delete mode 100644 src/components/Schema/PropertyValues.ts delete mode 100644 src/components/Schema/Schema.module.scss delete mode 100644 src/components/Schema/Schema.spec.tsx delete mode 100644 src/components/Schema/Schema.tsx delete mode 100644 src/components/Schema/SchemaContext.ts delete mode 100644 src/components/Schema/ServiceTag.module.scss delete mode 100644 src/components/Schema/ServiceTag.spec.tsx delete mode 100644 src/components/Schema/ServiceTag.tsx delete mode 100644 src/components/Schema/Tag.module.scss delete mode 100644 src/components/Schema/Tag.tsx delete mode 100644 src/components/Schema/index.ts delete mode 100644 src/components/Schema/types.d.ts delete mode 100644 src/components/SearchResult.module.scss delete mode 100644 src/components/SearchResult.tsx delete mode 100644 src/components/SystemsStatusIcons.module.scss delete mode 100644 src/components/SystemsStatusIcons.tsx delete mode 100644 src/components/ZipFileContent.tsx delete mode 100644 src/gatsby/gatsby-browser/index.ts delete mode 100644 src/gatsby/gatsby-browser/onClientEntry.ts delete mode 100644 src/gatsby/gatsby-browser/onRouteUpdate.ts delete mode 100644 src/gatsby/gatsby-browser/wrapRootElement.tsx delete mode 100644 src/gatsby/gatsby-config/feeds/createReleaseNotesFeed.ts delete mode 100644 src/gatsby/gatsby-config/feeds/createServerIpAddressesFeed.ts delete mode 100644 src/gatsby/gatsby-config/index.ts delete mode 100644 src/gatsby/gatsby-config/remark/sectionize.spec.ts delete mode 100644 src/gatsby/gatsby-config/remark/sectionize.ts delete mode 100644 src/gatsby/gatsby-node/createPages.ts delete mode 100644 src/gatsby/gatsby-node/createResolvers.ts delete mode 100644 src/gatsby/gatsby-node/createSchemaCutomization.ts delete mode 100644 src/gatsby/gatsby-node/index.ts delete mode 100644 src/gatsby/gatsby-node/onCreateNode.ts delete mode 100644 src/gatsby/gatsby-node/onCreateWebpackConfig.ts delete mode 100644 src/gatsby/gatsby-node/pages/createMdxPages.ts delete mode 100644 src/gatsby/gatsby-ssr/index.ts delete mode 100644 src/gatsby/gatsby-ssr/replaceRenderer.tsx delete mode 100644 src/gatsby/gatsby-ssr/wrapRootElement.tsx delete mode 100644 src/globals.d.ts delete mode 100644 src/hooks/useActiveHeading.ts delete mode 100644 src/hooks/useIsClient.ts delete mode 100644 src/hooks/useSystemStatus.tsx delete mode 100644 src/images/maxmind-icon.png delete mode 100644 src/languages.ts delete mode 100644 src/pages/search-results.module.scss delete mode 100644 src/pages/search-results.tsx delete mode 100644 src/services/GoogleSearch.ts delete mode 100644 src/store/index.tsx delete mode 100644 src/styles/_reset.scss delete mode 100644 src/styles/_variables.scss delete mode 100644 src/styles/global.scss delete mode 100644 src/templates/Home/Home.module.scss delete mode 100644 src/templates/Home/Home.tsx delete mode 100644 src/templates/Home/Product.module.scss delete mode 100644 src/templates/Home/Product.tsx delete mode 100644 src/templates/Home/index.ts delete mode 100644 src/templates/Home/query.ts delete mode 100644 src/templates/Overview/Overview.module.scss delete mode 100644 src/templates/Overview/Overview.tsx delete mode 100644 src/templates/Overview/index.ts delete mode 100644 src/templates/Overview/query.ts delete mode 100644 src/templates/Page/Page.module.scss delete mode 100644 src/templates/Page/Page.tsx delete mode 100644 src/templates/Page/ReleaseNotesArchiveList.tsx delete mode 100644 src/templates/Page/TableOfContents.module.scss delete mode 100644 src/templates/Page/TableOfContents.tsx delete mode 100644 src/templates/Page/index.ts delete mode 100644 src/templates/Page/query.ts delete mode 100644 src/types/Item.ts delete mode 100644 src/types/globals/index.d.ts delete mode 100644 src/types/openapi-types/index.d.ts delete mode 100644 src/types/remark/index.d.ts delete mode 100644 src/types/vfile-message/index.d.ts delete mode 100644 src/utils/get-toc-items--direct.fixture.json delete mode 100644 src/utils/get-toc-items--indirect.fixture.json delete mode 100644 src/utils/get-toc-items.spec.ts delete mode 100644 src/utils/get-toc-items.ts delete mode 100644 src/utils/json.spec.ts delete mode 100644 src/utils/json.ts delete mode 100644 src/utils/markdown.tsx delete mode 100644 src/utils/openapi.spec.ts delete mode 100644 src/utils/openapi.ts delete mode 100644 src/utils/pagination.spec.ts delete mode 100644 src/utils/pagination.ts diff --git a/src/assets/index.ts b/src/assets/index.ts deleted file mode 100644 index cd0fecbd1..000000000 --- a/src/assets/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as React from 'react'; -import { - FaBookOpen as ApiReferenceIcon, - FaCloud as WebServiceIcon, - FaCogs as IntegrationsIcon, - FaDatabase as DatabaseIcon, - FaFileCsv as CsvIcon, - FaMapMarkedAlt as GeolocateIAddressIcon, -} from 'react-icons/fa'; - -import GeoIPIcon from './svgs/geoip-icon.svg'; -import MinFraudIcon from './svgs/minfraud-icon.svg'; - -export const Icons: Record>> = { - ApiReferenceIcon, - CsvIcon, - DatabaseIcon, - GeoIPIcon, - GeolocateIAddressIcon, - IntegrationsIcon, - MinFraudIcon, - WebServiceIcon, -}; diff --git a/src/assets/svgs/geoip-icon.svg b/src/assets/svgs/geoip-icon.svg deleted file mode 100644 index afb9461af..000000000 --- a/src/assets/svgs/geoip-icon.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/svgs/icon-ccpa-opt-out.svg b/src/assets/svgs/icon-ccpa-opt-out.svg deleted file mode 100644 index 69336d465..000000000 --- a/src/assets/svgs/icon-ccpa-opt-out.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/svgs/maxmind-footer-logo.svg b/src/assets/svgs/maxmind-footer-logo.svg deleted file mode 100644 index c25e8f93f..000000000 --- a/src/assets/svgs/maxmind-footer-logo.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/assets/svgs/maxmind-logo.svg b/src/assets/svgs/maxmind-logo.svg deleted file mode 100644 index 20f766c2e..000000000 --- a/src/assets/svgs/maxmind-logo.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/svgs/minfraud-icon.svg b/src/assets/svgs/minfraud-icon.svg deleted file mode 100644 index 6ede5f177..000000000 --- a/src/assets/svgs/minfraud-icon.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/src/assets/svgs/under-construction.svg b/src/assets/svgs/under-construction.svg deleted file mode 100644 index 758750941..000000000 --- a/src/assets/svgs/under-construction.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/baseQuery.ts b/src/baseQuery.ts deleted file mode 100644 index ede11336d..000000000 --- a/src/baseQuery.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface IBaseQuery { - fields: { - slug: string; - }; - fileAbsolutePath: string; - frontmatter: { - description: string; - draft: boolean; - image: string; - keywords: string[]; - title: string; - }; -} - -export const BaseQuery = ` - fragment BaseQuery on Mdx { - fields { - slug - } - fileAbsolutePath - frontmatter { - title - description - image - keywords - draft - } - } -`; diff --git a/src/components/Alert.module.scss b/src/components/Alert.module.scss deleted file mode 100644 index 5fe6e8f48..000000000 --- a/src/components/Alert.module.scss +++ /dev/null @@ -1,85 +0,0 @@ -@use '../styles/variables'; - -.alert { - --mm-color-primary-text: #444; - --mm-spacing: 20px; - - background: linear-gradient(#fff, var(--mm-color-sidebar)); - border: 1px solid #eee; - border-bottom: 1px solid #ddd; - border-left: 6px solid #7eadda; - border-radius: 0 var(--mm-border-radius) var(--mm-border-radius) 0; - border-top: 1px solid rgb(245, 245, 245); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - color: var(--mm-color-primary-text); - display: flex; - margin: calc(var(--mm-spacing) * 2) 0; - padding-left: calc(var(--mm-spacing) / 2); - position: relative; -} - -.iconWrapper { - background: var(--mm-color-active-blue); - border-radius: 50%; - display: grid; - height: 35px; - left: -2px; - overflow: hidden; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); - width: 35px; - z-index: 3; - - &::before { - border-radius: 50%; - box-shadow: inset 0 0 0 3px rgba(255, 255, 255, 0.35); - content: ' '; - display: block; - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; - z-index: -1; - } -} - -.icon { - align-self: center; - color: #fff; - font-size: 14px; - justify-self: center; -} - -.content { - padding: 0 var(--mm-spacing); -} - -.content * { - font-size: 14px !important; -} - -.error { - border-left-color: #f09791; -} - -.error .iconWrapper { - background: #e9594c; -} - -.success { - border-left-color: #87d8aa; -} - -.success .iconWrapper { - background: #3ac279; -} - -.warning { - border-left-color: rgba(232, 159, 41, 1); -} - -.warning .iconWrapper { - background: #e89f29; -} diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx deleted file mode 100644 index c11021fb1..000000000 --- a/src/components/Alert.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; -import { IconType } from 'react-icons'; -import { - FaCheck, - FaExclamation, - FaInfo, - FaTimes, -} from 'react-icons/fa'; - -// eslint-disable-next-line css-modules/no-unused-class -import * as styles from './Alert.module.scss'; - -interface IAlert { - children: React.ReactNode, - type: 'error' | 'info' | 'success' | 'warning', -} - -const Alert: React.FC = (props) => { - const { children, type } = props; - let Icon: IconType; - - switch(type) { - case 'error': - Icon = FaTimes; - break; - case 'success': - Icon = FaCheck; - break; - case 'warning': - Icon = FaExclamation; - break; - case 'info': - Icon = FaInfo; - break; - } - - return ( -
-
- -
-
- {children} -
-
- ); -}; - -Alert.defaultProps = { - type: 'info', -}; - -Alert.propTypes = { - children: PropTypes.node.isRequired, - type: PropTypes.oneOf([ - 'error', - 'info', - 'success', - 'warning', - ] as const).isRequired, -}; - -export default Alert; diff --git a/src/components/CsvBlockTable.tsx b/src/components/CsvBlockTable.tsx deleted file mode 100644 index 390c4dc68..000000000 --- a/src/components/CsvBlockTable.tsx +++ /dev/null @@ -1,565 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { - a as A, - inlineCode as Code, - li as Li, - strong as Strong, - table as Table, - td as Td, - th as Th, - tr as Tr, - ul as Ul, -} from './Mdx'; -import ServiceTag from './Schema/ServiceTag'; - -interface ICsvBlockTable { - isEnterprise?: boolean; -} - -const CsvBlockTable: React.FC = (props) => { - const { isEnterprise } = props; - return ( - - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - { isEnterprise && ( - <> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - )} - - - - - { !isEnterprise && ( - - )} - - -
NameTypeDescriptionIncluded in...
networkIP network as a string - This is the IPv4 or IPv6 network in CIDR format such as - "2.21.92.0/29" or "2001:4b0::/80". We offer a - utility to convert this column to start/end IPs or start/end - integers. See - {' '} - - the conversion utility - section - - {' '} - for details. - - - -
geoname_idinteger - A unique identifier for the network's location as specified - by - {' '} - - GeoNames - - . This ID can be - used to look up the location information in the Location file. -
-
- - Learn more about GeoNames IDs on our Knowledge Base. - -
- - -
registered_country_geoname_idinteger - The registered country is the country in which the ISP has - registered the network. This column contains a unique identifier - for the network's registered country as specified - by - {' '} - - GeoNames - - . This ID can be - used to look up the location information in the Location file. -
-
- - Learn more about registered countries on our Knowledge Base. - -
- - -
represented_country_geoname_idinteger - The represented country is the country which is represented by - users of the IP address. For instance, the country represented by - an overseas military base. This column contains a unique - identifier for the network's represented country as specified - by - {' '} - - GeoNames - - . This ID can be - used to look up the location information in the Location file. -
-
- - Learn more about represented countries on our Knowledge Base. - -
- - -
is_anonymous_proxyboolean - Deprecated. - {' '} - Please see our - {' '} - - GeoIP2 Anonymous IP database - - {' '} - to determine whether the IP address is used by an anonymizing - service. - - - -
is_satellite_providerboolean - Deprecated. - - - -
postal_codestring - A postal code close to the user's location. For the following - countries, we return partial postal codes with the number of - characters indicated below: - -
    -
  • United States: 5
  • -
  • Canada: 3
  • -
  • United Kingdom: 2-4
  • -
  • Brazil: 5
  • -
  • Ireland: 3
  • -
  • - Japan: 7 (specified for the first 6. The last digit defaults to - 1) -
  • -
  • Netherlands: 4
  • -
  • - Portugal: 7 (accurate for the first 4. The last 3 often defaults - to - {' '} - -001 - ) -
  • -
  • Singapore: 2
  • -
-
- - -
latitude*decimal - The approximate - {' '} - - WGS84 - - {' '} - latitude of the location associated with the network. -
-
- - Learn about the geolocation area defined by latitude, longitude, - and accuracy radius, on our Knowledge Base. - -
- - -
longitude*decimal - The approximate - {' '} - - WGS84 - - {' '} - longitude of the location associated with the network. -
-
- - Learn about the geolocation area defined by latitude, longitude, - and accuracy radius, on our Knowledge Base. - -
- - -
accuracy_radiusinteger - The radius in kilometers around the specified location where the IP - address is likely to be. -
-
- - Learn about the geolocation area defined by latitude, longitude, - and accuracy radius, on our Knowledge Base. - -
- - -
isp_idinteger - A identifier for the ISP. This ID can be used to look up the - location information in the ISP file. -
-
- - Learn more about ISP data on our Knowledge Base. - -
domainstring - The domain associated with the network. -
-
- - Learn more about domain name data on our Knowledge Base. - -
country_confidencedecimal (1-100) - The confidence that the country was correctly geolocated. -
-
- - Learn more about confidence factors on our Knowledge Base. - -
subdivision_confidencedecimal (1-100) - The confidence that the most specific subdivision was correctly - geolocated. -
-
- - Learn more about confidence factors on our Knowledge Base. - -
city_confidencedecimal (1-100) - The confidence that the city was correctly geolocated. -
-
- - Learn more about confidence factors on our Knowledge Base. - -
postal_confidencedecimal (1-100) - The confidence that the postal code was correctly geolocated. -
-
- - Learn more about confidence factors on our Knowledge Base. - -
is_legitimate_proxyboolean - Deprecated. - {' '} - Use the - {' '} - user_type - {' '} - data to identify traffic from businesses. - {' '} - - Learn more about - {' '} - user_type - {' '} - data on our knowledge base - - . To identify anonymous proxies, you can learn - more about the GeoIP2 Anonymous IP database in - {' '} - - the developer portal - - {' '} - or - {' '} - - our main website - - . -
is_anycastboolean - This is - {' '} - 1 - {' '} - if the network is an - {' '} - - anycast network - - . - { !isEnterprise && ( -
- This column will be empty in GeoLite2-Country and GeoLite2-City. -
- )} -
- - -
- ); -}; - -CsvBlockTable.propTypes = { - isEnterprise: PropTypes.bool, -}; - -export default CsvBlockTable; diff --git a/src/components/CsvExampleFiles.tsx b/src/components/CsvExampleFiles.tsx deleted file mode 100644 index 19d602279..000000000 --- a/src/components/CsvExampleFiles.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { a as A, li as Li, p as P, ul as Ul } from './Mdx'; - -interface IExampleFiles { - files: { - filename: string; - link: string; - }[] -} - -const CsvExampleFiles: React.FC = (props) => { - const { files } = props; - const fileItems = files.map((file) => ( -
  • - - {file.filename} - -
  • - )); - - return ( - <> -

    - We maintain examples of the CSV files as they would be downloaded from - the account portal: -

    - -

    -

      - {fileItems} -
    -

    - - ); -}; - -CsvExampleFiles.propTypes = { - files: PropTypes.array.isRequired, -}; - -export default CsvExampleFiles; diff --git a/src/components/CsvLocationTable.tsx b/src/components/CsvLocationTable.tsx deleted file mode 100644 index 02926b92a..000000000 --- a/src/components/CsvLocationTable.tsx +++ /dev/null @@ -1,454 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { - a as A, - inlineCode as Code, - strong as Strong, - table as Table, - td as Td, - th as Th, - tr as Tr, -} from './Mdx'; -import ServiceTag from './Schema/ServiceTag'; - -interface ICsvLocationTable { - isEnterprise?: boolean; -} - -const CsvLocationTable: React.FC = (props) => { - const { isEnterprise } = props; - return ( - - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - - - - - { !isEnterprise && ( - - )} - - -
    NameTypeDescriptionIncluded in...
    geoname_idinteger - A unique identifier for the a location as specified - by - {' '} - - GeoNames - - . This ID can be - used as a key for the Location file. -
    -
    - - Learn more about GeoNames IDs on our Knowledge Base. - -
    - - -
    locale_codestring - The locale that the names in this row are in. This will always - correspond to the locale name of the file. - - - -
    continent_codestring (2) -

    The continent code for this location. Possible codes are:

    -
      -
    • - AF - {' '} - - Africa -
    • -
    • - AN - {' '} - - Antarctica -
    • -
    • - AS - {' '} - - Asia -
    • -
    • - EU - {' '} - - Europe -
    • -
    • - NA - {' '} - - North America -
    • -
    • - OC - {' '} - - Oceania -
    • -
    • - SA - {' '} - - South America -
    • -
    -
    - - -
    continent_namestring - The continent name for this location in the file's locale. -
    -
    - - Learn more about localized names on our Knowledge Base. - -
    - - -
    country_iso_codestring (2) - A two-character - {' '} - - ISO - 3166-1 - - {' '} - country code for the country associated with the location. - - - -
    country_namestring - The country name for this location in the file's locale. -
    -
    - - Learn more about localized names on our Knowledge Base. - -
    - - -
    subdivision_1_iso_codestring (1-3) - A string of up to three characters containing the region-portion of - the - {' '} - - ISO 3166-2 - - {' '} - code for the first level region associated with the IP address. - Some countries have two levels of subdivisions, in which case this - is the least specific. For example, in the United Kingdom this will - be a country like "England", not a county like - "Devon". - - - -
    subdivision_1_namestring - The subdivision name for this location in the file's locale. - As with the subdivision code, this is the least specific - subdivision for the location. -
    -
    - - Learn more about localized names on our Knowledge Base. - -
    - - -
    subdivision_2_iso_codestring (1-3) - A string of up to three characters containing the region-portion of - the - {' '} - - ISO 3166-2 - - {' '} - code for the second level region associated with the IP address. - Some countries have two levels of subdivisions, in which case this - is the most specific. For example, in the United Kingdom this will - be a a county like "Devon", not a country like - "England". - - - -
    subdivision_2_namestring - The subdivision name for this location in the file's locale. - As with the subdivision code, this is the most specific subdivision - for the location. -
    -
    - - Learn more about localized names on our Knowledge Base. - -
    - - -
    city_namestring - The city name for this location in the file's locale. -
    -
    - - Learn more about localized names on our Knowledge Base. - -
    - - -
    metro_codeinteger - Metro code is a geolocation target code from Google. - - - -
    time_zonestring - The time zone associated with location, as specified by - the - {' '} - - IANA Time Zone - Database - - , e.g., “America/New_York”. - - - -
    is_in_european_unionboolean - This is - {' '} - 1 - {' '} - if the country associated with the location is a member - state of the European Union. It is - {' '} - 0 - {' '} - otherwise. - - - -
    - ); -}; - -CsvLocationTable.propTypes = { - isEnterprise: PropTypes.bool, -}; - -export default CsvLocationTable; diff --git a/src/components/DatabaseChanges.tsx b/src/components/DatabaseChanges.tsx deleted file mode 100644 index 23c7897d4..000000000 --- a/src/components/DatabaseChanges.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { a as A, p as P } from './Mdx'; - -interface IDatabaseName { - product: string; -} - -const DatabaseChanges: React.FC = (props) => { - const { product } = props; - return ( - <> -

    - We may add new data fields to the - {' '} - {product} - {' '} - database at any time. -

    - -

    - New database fields are added as new columns to the right of existing - {' '} - columns in our CSV files, and as additional data in our MMDB files. -

    - -

    - Subscribe to our - {' '} - - GeoIP2 release notes - - {' '} - to be notified when new data is added to our databases. -

    - - ); -}; - -DatabaseChanges.propTypes = { - product: PropTypes.string.isRequired, -}; - -export default DatabaseChanges; diff --git a/src/components/DatabaseSizes.tsx b/src/components/DatabaseSizes.tsx deleted file mode 100644 index 906052e7f..000000000 --- a/src/components/DatabaseSizes.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { li as Li, p as P, table as Table, tbody as Tbody, td as Td, th as Th, thead as Thead, tr as Tr, ul as Ul } from './Mdx'; - -interface IDatabaseSizes { - databaseChanges: { - csvSizeRange: string; - databaseName: string; - ipv4Range: string; - ipv6Range: string; - mmdbSizeRange: string; - }[]; - dateRange: string; -} - -const DatabaseSizes: React.FC = (props) => { - const { databaseChanges , dateRange } = props; - const databaseChangesItems = databaseChanges.map((databaseChange) => ( - <> - - - {databaseChange.databaseName} - - - {databaseChange.csvSizeRange} - - - {databaseChange.mmdbSizeRange} - - - {databaseChange.ipv4Range} - - - {databaseChange.ipv6Range} - - - - )); - return ( - <> -

    - MaxMind databases can vary in size from release to release. If you are - working with file size limitations that are concerning, you should build - your integrations to fail gracefully in event of a significant size - change. -

    - -

    - From - {' '} - {dateRange} - , the database files varied in file size and number of networks as - follows: -

    - - - - - - - - - - - - - {databaseChangesItems} - -
    - Database - - CSV File Size - - MMDB File Size - - IPv4 Networks - - IPv6 Networks -
    - -

    - The listed file sizes are for unpacked databases. Databases are - downloaded in a compressed format. -

    - - ); -}; - -DatabaseSizes.propTypes = { - databaseChanges: PropTypes.array.isRequired, - dateRange: PropTypes.string.isRequired, -}; - -export default DatabaseSizes; diff --git a/src/components/Example.module.scss b/src/components/Example.module.scss deleted file mode 100644 index 213745701..000000000 --- a/src/components/Example.module.scss +++ /dev/null @@ -1,29 +0,0 @@ -@use '../styles/variables'; - -.container { - margin: calc(var(--mm-spacing) / 2) 0; -} - -.label { - font-size: 14px; - font-weight: 500; - margin-bottom: 15px; -} - -.value { - margin: calc(var(--mm-spacing) / 4) 0 0 0; - max-width: calc(100vw - calc(var(--mm-spacing) * 2 - 2px)); - padding-top: 0; -} - -@include variables.breakpoint('lg') { - .value { - max-width: calc(100vw - var(--mm-layout-sidebar-width) - calc(var(--mm-spacing) * 3) - 4px); - } -} - -@include variables.breakpoint('xl') { - .value { - max-width: calc(680px - var(--mm-spacing)); - } -} diff --git a/src/components/Example.tsx b/src/components/Example.tsx deleted file mode 100644 index 1b96059d8..000000000 --- a/src/components/Example.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { pre as Pre } from './Mdx'; - -import * as styles from './Example.module.scss'; - -interface IExample { - children: React.ReactNode, - className?: string; - label?: string; - language: 'bash' | 'json'; -} - -const Example: React.FC = (props) => { - const { children, className, label, language } = props; - - const languageClass = `language-${language}`; - - return ( -
    - {label && ( -
    - {label} -
    - )} - -
    -        
    -          {children}
    -        
    -      
    -
    - ); -}; - -Example.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - label: PropTypes.string, - language: PropTypes.oneOf([ - 'bash', - 'json', - ] as const).isRequired, -}; - -export default Example; diff --git a/src/components/Layout/AccessibilityNav.module.scss b/src/components/Layout/AccessibilityNav.module.scss deleted file mode 100644 index 88f259fd7..000000000 --- a/src/components/Layout/AccessibilityNav.module.scss +++ /dev/null @@ -1,54 +0,0 @@ -@use '../../styles/variables'; - -.container { - @include variables.opaque-overlay; - width: 100%; - - &:focus-within { - display: grid; - grid-template-columns: 1fr; - grid-template-rows: min-content; - height: 100%; - /* autoprefixer: ignore next */ - justify-items: center; - } -} - -.list { - background-color: var(--mm-color-background); - border: 1px solid var(--mm-color-border); - border-radius: 12px; - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); - margin: var(--mm-spacing); - max-width: 70vh; -} - -.listItem { - border-bottom: 1px solid var(--mm-color-border); - - &:last-of-type { - border: 0; - } -} - -.link { - border-left: 2vh solid transparent; - border-right: 2vh solid transparent; - color: var(--mm-color-primary-text); - display: block; - font-family: var(--mm-font-stack-display); - font-size: 5vh; - line-height: 1em; - padding: 5vh; - text-decoration: none; - - &:hover, - &:focus { - color: var(--mm-color-display-text); - } - - &:focus { - background-color: var(--mm-color-sidebar); - font-weight: 700; - } -} diff --git a/src/components/Layout/AccessibilityNav.tsx b/src/components/Layout/AccessibilityNav.tsx deleted file mode 100644 index b1061bb1a..000000000 --- a/src/components/Layout/AccessibilityNav.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import * as styles from './AccessibilityNav.module.scss'; - -const AccessibilityNav: React.FC> = (props) => ( - // eslint-disable-next-line jsx-a11y/no-access-key -
    - -
    -); - -AccessibilityNav.propTypes = { - className: PropTypes.string, -}; - -export default AccessibilityNav; diff --git a/src/components/Layout/Footer.module.scss b/src/components/Layout/Footer.module.scss deleted file mode 100644 index 2ad296339..000000000 --- a/src/components/Layout/Footer.module.scss +++ /dev/null @@ -1,247 +0,0 @@ -@use '../../styles/variables'; - -.footer { - background: rgb(46, 58, 71); - color: #fff; - font-size: 14px; - position: relative; - - @include variables.pattern; - - &::after { - background: rgba(25, 19, 6, 0.7); - } -} - -.container { - column-gap: 0; - display: grid; - grid-template-areas: - 'a b' - 'c d' - 'branding branding' - 'copyright copyright'; - grid-template-columns: 50% 50%; - position: relative; - row-gap: 0; - z-index: 2; -} - -.group { - padding: var(--mm-spacing); - padding-bottom: 0; -} - -.group__products { - grid-area: a; -} - -.group__support { - grid-area: b; -} - -.group__developers { - grid-area: c; -} - -.group__company { - grid-area: d; -} - -.heading { - color: #c0d2e4; - font-family: var(--mm-font-stack-display); - font-size: 16px; - font-weight: 500; - margin-bottom: calc(var(--mm-spacing) / 2); -} - -.link { - color: #fff; - display: block; - margin-bottom: 10px; - text-decoration: none; - - &:hover { - text-decoration: underline; - } -} - -.status, -.ccpa { - position: relative; - - &:hover { - text-decoration: none; - } -} - -.statusIcon { - left: -10px; - position: absolute; - top: 50%; - transform: translate(-100%, -50%); -} - -.status:hover .statusText { - text-decoration: underline; -} - -.ccpaIcon { - left: -10px; - position: absolute; - top: 57%; - transform: translate(-100%, -50%); - - svg { - height: 14px; - } -} - -.branding { - /* autoprefixer: ignore next */ - align-items: flex-end; - display: flex; - flex: 1 0 0; - grid-area: branding; - justify-content: space-between; - padding: var(--mm-spacing) var(--mm-spacing) 0; -} - -.logo { - display: inline-block; - margin-right: 10px; - width: 160px; -} - -.social { - margin-bottom: 14px; -} - -.socialIcon { - color: #fff; - display: inline-block; - font-size: 30px; - margin-left: calc(var(--mm-spacing) / 4); -} - -.copyright { - font-size: 12px; - grid-area: copyright; - padding: var(--mm-spacing) var(--mm-spacing) calc(var(--mm-spacing) * 2.5); - text-align: center; -} - -.terms { - margin-top: calc(var(--mm-spacing) / 2); - text-align: center; -} - -.termsLink { - color: #fff; - text-decoration: none; - - &:first-child::after { - color: rgba(255, 255, 255, 0.2); - content: '|'; - padding: 0 10px; - } -} - -@include variables.breakpoint('md') { - .container { - grid-template-areas: - 'a b c d' - 'branding branding copyright copyright'; - grid-template-columns: 1fr 1fr 1fr 1fr; - grid-template-rows: max-content; - } - - .branding { - grid-column: span 2; - justify-content: left; - order: 1; - padding-bottom: var(--mm-spacing); - } - - .logo { - width: 200px; - } - - .copyright { - grid-column: 3 / span 2; - text-align: right; - } - - .terms { - text-align: right; - } -} - -@include variables.breakpoint('xl') { - .container { - grid-template-areas: - 'branding a b c d' - 'branding copyright copyright copyright copyright'; - grid-template-columns: var(--mm-layout-sidebar-width) 1fr 1fr 1fr 1fr; - } - - .branding { - /* autoprefixer: ignore next */ - align-content: flex-start; - border-top: 0; - display: grid; - grid-area: branding; - grid-template-areas: - 'logo' - 'social'; - /* autoprefixer: ignore next */ - justify-content: center; - order: 0; - } - - .logo { - display: block; - grid-area: logo; - margin: 0 0 calc(var(--mm-spacing) / 4); - width: 200px; - } - - .social { - display: flex; - grid-area: social; - justify-content: center; - } - - .socialIcon:first-of-type { - margin-left: 0; - } - - .copyright { - /* autoprefixer: ignore next */ - align-items: top; - display: grid; - /* autoprefixer: ignore next */ - grid-area: copyright; - grid-column-gap: var(--mm-spacing); - grid-template-areas: 'p terms'; - grid-template-columns: 3fr 1fr; - text-align: left; - } - - .copyright p { - grid-area: p; - } - - .terms { - grid-area: terms; - margin-top: 0; - text-align: right; - } -} - -@include variables.breakpoint('xxxl') { - .container { - max-width: map-get(variables.$breakpoints, 'xxxl'); - } -} diff --git a/src/components/Layout/Footer.tsx b/src/components/Layout/Footer.tsx deleted file mode 100644 index ff8fe3860..000000000 --- a/src/components/Layout/Footer.tsx +++ /dev/null @@ -1,306 +0,0 @@ -import classNames from 'classnames'; -import React from 'react'; -import { FaLinkedin, FaTwitterSquare } from 'react-icons/fa'; - -import CcpaIcon from '../../assets/svgs/icon-ccpa-opt-out.svg'; -import Logo from '../../assets/svgs/maxmind-footer-logo.svg'; -import useSystemStatus from '../../hooks/useSystemStatus'; - -import * as styles from './Footer.module.scss'; - -const Footer: React.FC> = (props) => { - const systemStatus = useSystemStatus(); - - return ( - - ); -}; - -export default Footer; diff --git a/src/components/Layout/Header.module.scss b/src/components/Layout/Header.module.scss deleted file mode 100644 index 104b6fa15..000000000 --- a/src/components/Layout/Header.module.scss +++ /dev/null @@ -1,201 +0,0 @@ -@use '../../styles/variables'; - -.systemStatus { - background-color: #2e3a47; - padding: 10px; - - &::after { - background: rgba(25, 19, 6, 0.7); - } -} - -.systemStatus__content { - align-items: center; - color: #c0d2e4; - display: grid; - font-size: 14px; - gap: 10px; - grid-auto-flow: column; - grid-template-columns: repeat(3, max-content); - justify-content: center; - position: relative; - z-index: 1; -} - -.systemStatus__content a { - color: #fff; -} - -.header { - background: var(--mm-color-background); - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 13px 0, rgba(0, 0, 0, 0.06) 0 1px 5px 0; - height: var(--page-header-height); - padding-top: 10px; - position: sticky; - top: 0; - width: 100%; - z-index: 10; - - @include variables.pattern-border; -} - -.accessibilityNav { - height: 0; - left: 0; - overflow: hidden; - position: fixed; - top: 0; - z-index: 20; - - &:focus-within { - height: 100%; - } -} - -.nav { - display: grid; - grid-template-areas: 'logo search menu'; - grid-template-columns: max-content 1fr max-content; - grid-template-rows: auto; - height: calc(var(--page-header-height) - 10px); - padding: 0 var(--mm-spacing); -} - -/* IE11 content alignment fix */ -.nav > * { align-self: center; } - -.logo { - display: grid; - gap: 8px; - grid-area: logo; - grid-template-areas: 'svg site-name'; - grid-template-columns: auto; - margin-right: calc(var(--mm-spacing) / -4); - padding: calc(var(--mm-spacing) / 4); - text-decoration: none; - transform: translateX(calc(var(--mm-spacing) / -4)); -} - -.logo__svg { - align-self: center; - grid-area: svg; - max-width: 125px; - width: 100%; -} - -.logo__siteName { - align-self: center; - color: var(--mm-color-primary-text); - font-family: var(--mm-font-stack-display); - font-size: 10px; - font-style: italic; - font-weight: 600; - grid-area: site-name; - letter-spacing: 1px; - line-height: 1; - overflow: hidden; - padding-left: 9px; - position: relative; - text-transform: uppercase; - - &::before { - background: #ccc; - content: ' '; - display: block; - height: 100%; - left: 0; - position: absolute; - top: 50%; - transform: rotate(20deg) translateY(-50%); - width: 1px; - } -} - -.eloper { - display: none; -} - -.search { - grid-area: search; - width: 100%; -} - -@include variables.breakpoint('sm') { - .logo { - gap: 10px; - grid-template-areas: 'svg site-name'; - grid-template-columns: auto; - } - - .logo__siteName { - padding-left: 18px; - } - - .eloper { - display: inline; - } -} - -@include variables.breakpoint('lg') { - .nav { - grid-template-columns: calc(var(--mm-layout-sidebar-width) - var(--mm-spacing)) 1fr; - grid-template-rows: auto; - } - - .logo__svg { - max-width: initial; - } - - .logo__siteName { - font-size: 12px; - } - - .search { - padding-left: var(--mm-spacing); - } -} - -@include variables.breakpoint('xl') { - .search { - align-self: center; - display: flex; - justify-self: center; - max-width: 880px; - padding-left: var(--mm-spacing); - width: calc(100% - var(--mm-layout-sidebar-width) - calc(var(--mm-spacing) * 2)); - width: 100%; - } -} - -@media only screen and (min-width: 1230px) { - .search { - max-width: 840px; - } -} - -@include variables.breakpoint('xxl') { - .search { - justify-self: start; - width: calc(100% - var(--mm-layout-sidebar-width) + 60px); - } -} - -@media only screen and (min-width: 1480px) { - .search { - justify-self: center; - max-width: 840px; - transform: translateX(calc(var(--mm-layout-toc-width) * -0.5)); - } -} - -.toggle { - @include variables.menu-button; - grid-area: menu; - z-index: 4; -} - -@include variables.breakpoint('lg') { - .toggle { - display: none; - } -} diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx deleted file mode 100644 index 98d3801dd..000000000 --- a/src/components/Layout/Header.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaBars, FaTimes } from 'react-icons/fa'; - -import Logo from '../../assets/svgs/maxmind-logo.svg'; -import useSystemStatus from '../../hooks/useSystemStatus'; -import Link from '../Link'; -import AccessibilityNav from './AccessibilityNav'; -import SearchBar from './SearchBar'; - -import * as styles from './Header.module.scss'; - -interface IHeader { - isSidebarOpen?: boolean; - toggleSidebar: () => void; -} - -const Header: React.FC = (props) => { - const systemStatus = useSystemStatus(); - const { isSidebarOpen, toggleSidebar } = props; - return ( - <> - - {systemStatus && systemStatus.class !== 'operational' && ( -
    -
    - {systemStatus.icon} - {' '} - {systemStatus.title} - {': '} - {systemStatus.message} - {' '} - - More info » - -
    -
    - )} -
    -
    - - - - Dev - - eloper - - s - - - - -
    -
    - - ); -}; - -Header.propTypes = { - isSidebarOpen: PropTypes.bool, - toggleSidebar: PropTypes.func.isRequired, -}; - -export default Header; diff --git a/src/components/Layout/Layout.module.scss b/src/components/Layout/Layout.module.scss deleted file mode 100644 index b69515673..000000000 --- a/src/components/Layout/Layout.module.scss +++ /dev/null @@ -1,82 +0,0 @@ -@use '../../styles/variables'; -@use '../../styles/global'; - -$transition: all 0.15s ease-out; - -.container { - display: flex; - flex-direction: column; - min-height: 100vh; -} - -.main { - background: var(--mm-color-background); - display: grid; - flex: 1 1 auto; - /* autoprefixer: ignore next */ - grid-template-areas: 'article sidebar'; - grid-template-columns: 360px var(--mm-layout-sidebar-width); - grid-template-rows: 100%; - transition: $transition; -} - -.main__hasSidebar { - visibility: visible; -} - -.content { - grid-area: article; - scroll-margin-top: calc(var(--page-header-height) + var(--mm-spacing)); - transition: $transition; -} - -.sidebar__open::after { - @include variables.opaque-overlay; - content: ' '; - display: block; - height: 100vh; - left: 0; - position: fixed; - top: 0; - width: 100vw; - z-index: 8; -} - -.sidebar__hidden [class*='Sidebar-module--sidebar--'] { - transform: translate3d(360px, 0, 0); -} - -@include variables.breakpoint('xs') { - .main { - grid-template-columns: 100vw var(--mm-layout-sidebar-width); - grid-template-rows: 100%; - } - - .sidebar__hidden [class*='Sidebar-module--sidebar--'] { - transform: translate3d(100vw, 0, 0); - } -} - -@include variables.breakpoint('lg') { - .main__hasSidebar { - /* autoprefixer: ignore next */ - grid-template-areas: 'sidebar article'; - grid-template-columns: var(--mm-layout-sidebar-width) calc(100vw - var(--mm-layout-sidebar-width)); - } - - .main [class^='Sidebar-module'] { - display: none; - } - - .main__hasSidebar [class^='Sidebar-module'] { - display: block; - } - - .content { - grid-area: article; - } - - .sidebar--open::after { - display: none; - } -} diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx deleted file mode 100644 index 9ab473a8f..000000000 --- a/src/components/Layout/Layout.tsx +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Layout component that queries for data - * with Gatsby's useStaticQuery component - * - * See: https://www.gatsbyjs.org/docs/use-static-query/ - */ - -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React, { useState } from 'react'; - -import Footer from './Footer'; -import Header from './Header'; -import SEO from './Seo'; -import Sidebar from './Sidebar'; - -import * as styles from './Layout.module.scss'; - -interface ILayout { - children: React.ReactNode; - className?: string; - description?: string; - hasSidebar?: boolean; - image?: string; - isSidebarOpen?: boolean; - keywords?: string[]; - title: string; - type?: 'geoip' | 'minfraud'; -} - -const Layout: React.FC = (props) => { - const { - className, - children, - description, - hasSidebar, - image, - isSidebarOpen: sidebarState, - keywords, - title, - type, - } = props; - - const [ - isSidebarOpen, - setIsSidebarOpen, - ] = useState(sidebarState); - - const toggleSidebar = (): void => setIsSidebarOpen(!isSidebarOpen); - - const pageTypeClass: string | undefined = [ - 'geoip', - 'minfraud', - ].includes( - type as string - ) - ? `page-type--${type}` - : undefined; - - return ( -
    - - -
    - -
    - - -
    - {children} -
    -
    - -
    -
    - ); -}; - -Layout.defaultProps = { - hasSidebar: true, -}; - -Layout.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - description: PropTypes.string, - hasSidebar: PropTypes.bool, - isSidebarOpen: PropTypes.bool, - keywords: PropTypes.array, - title: PropTypes.string.isRequired, - type: PropTypes.oneOf([ - 'geoip', - 'minfraud', - ]), -}; - -export default Layout; diff --git a/src/components/Layout/SearchBar.module.scss b/src/components/Layout/SearchBar.module.scss deleted file mode 100644 index bf35f7b31..000000000 --- a/src/components/Layout/SearchBar.module.scss +++ /dev/null @@ -1,72 +0,0 @@ -@use '../../styles/variables'; - -.searchbar { - display: none; - position: relative; -} - -@include variables.breakpoint('lg') { - .searchbar { - display: inline-block; - width: 100%; - } -} - -@media only screen and (max-width: map-get(variables.$breakpoints, 'lg')) { - .searchbar__mobileOpen { - display: inline-block; - left: 0; - margin: 0 var(--mm-spacing); - position: absolute; - top: calc(50% + 5px); - transform: translateY(-50%); - width: calc(100% - (2 * var(--mm-spacing))); - z-index: 100; - } -} - -.mag { - color: var(--mm-color-primary-text); - left: calc(var(--mm-spacing) / 2); - position: absolute; - top: 50%; - transform: translateY(-50%); -} - -.searchMobile { - position: relative; -} - -@include variables.breakpoint('lg') { - .searchMobile { - display: none; - } -} - -.mobileButton { - @include variables.menu-button; - float: right; - margin-right: calc(var(--mm-spacing) / 4); -} - -.input { - appearance: none !important; - border: 1px solid var(--mm-color-border); - border-radius: var(--mm-border-radius); - color: var(--mm-color-primary-text); - padding: 12px 10px 12px calc(var(--mm-spacing) + 15px); - width: 100%; - - &::placeholder { - opacity: 0.5; - } - - &:focus { - box-shadow: 0 0 0 2px var(--mm-color-logo-blue-light); - outline: none; - } -} - -.hidden { - display: none; -} diff --git a/src/components/Layout/SearchBar.tsx b/src/components/Layout/SearchBar.tsx deleted file mode 100644 index 31cf072c1..000000000 --- a/src/components/Layout/SearchBar.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import classNames from 'classnames'; -import { navigate } from 'gatsby'; -import PropTypes from 'prop-types'; -import React, { useEffect, useRef, useState } from 'react'; -import { FaSearch } from 'react-icons/fa'; - -import * as styles from './SearchBar.module.scss'; - -interface ISearchBar { - className?: string; -} - -const SearchBar: React.FC = (props) => { - const [ - isMobileOpen, - setIsMobileOpen, - ] = useState(false); - - const [ - searchQuery, - setSearchQuery, - ] = useState(''); - - const inputRef = useRef(null); - - const toggleMobileOpen = (): void => { - setIsMobileOpen(true); - setTimeout(() => { - inputRef.current?.focus(); - }, 1); - }; - - const handleChange = (event: React.ChangeEvent) => { - setSearchQuery(event.target.value); - }; - - const handleSubmit = ((event: React.FormEvent) => { - event.preventDefault(); - navigate(`/search-results?q=${searchQuery}`); - }); - - let locationSearch: string; - - if (typeof window !== 'undefined') { - locationSearch = window.location.search; - } else { - locationSearch = ''; - } - - useEffect(() => { - const urlParams = new URLSearchParams(locationSearch); - setSearchQuery(urlParams.get('q') as string); - }, [ - locationSearch, - ]); - - return ( -
    -
    - - setIsMobileOpen(false)} - onChange={handleChange} - placeholder="Search" - ref={inputRef} - type="search" - /> - - -
    - -
    -
    - ); -}; - -SearchBar.propTypes = { - className: PropTypes.string, -}; - -export default SearchBar; diff --git a/src/components/Layout/Seo.tsx b/src/components/Layout/Seo.tsx deleted file mode 100644 index 5f9e5a5b8..000000000 --- a/src/components/Layout/Seo.tsx +++ /dev/null @@ -1,129 +0,0 @@ -/** - * SEO component that queries for data with - * Gatsby's useStaticQuery React hook - * - * See: https://www.gatsbyjs.org/docs/use-static-query/ - */ - -import { useLocation } from '@reach/router'; -import { graphql, useStaticQuery } from 'gatsby'; -import PropTypes from 'prop-types'; -import React from 'react'; -import Helmet, { HelmetProps } from 'react-helmet'; - -export interface ISEO extends HelmetProps { - description?: string; - image?: string; - lang?: string; -} - -const SEO: React.FC = (props) => { - const { bodyAttributes, description, image, lang, meta = [], title } = props; - const { site } = useStaticQuery( - graphql` - query { - site { - siteMetadata { - title - description - author - siteUrl - } - } - } - ` - ); - - const metaDescription = description || site.siteMetadata.description; - - const metaImage = new URL( - image ?? '/images/og-image.jpg', - site.siteMetadata.siteUrl - ).href; - - return ( - - ); -}; - -SEO.defaultProps = { - description: '', - lang: 'en', - meta: [], -}; - -SEO.propTypes = { - bodyAttributes: PropTypes.any, - description: PropTypes.string, - lang: PropTypes.string, - meta: PropTypes.arrayOf(PropTypes.any), - title: PropTypes.string.isRequired, -}; - -export default SEO; diff --git a/src/components/Layout/Sidebar.module.scss b/src/components/Layout/Sidebar.module.scss deleted file mode 100644 index 4e2bd1514..000000000 --- a/src/components/Layout/Sidebar.module.scss +++ /dev/null @@ -1,248 +0,0 @@ -@use '../../styles/variables'; - -.sidebar { - background: var(--mm-color-sidebar); - border-left: 1px solid var(--mm-color-border); - box-shadow: -2px -1px 3px rgba(0, 0, 0, 0.1); - grid-area: sidebar; - height: 100%; - max-width: var(--mm-layout-sidebar-width); - position: fixed; - right: 0; - transition: all 0.15s ease-out; - width: 100%; - z-index: 9; -} - -.nav { - height: calc(100vh - var(--page-header-height)); - overflow-y: auto; - position: sticky; - top: var(--page-header-height); -} - -.list { - background: transparent; -} - -.item { - border-top: 1px solid var(--mm-color-border); - color: #666; - margin: 2px 0 3px; - position: relative; -} - -.item:first-of-type { - border-top: 1px solid transparent; -} - -.item__active { - background: var(--mm-color-background); - border-right: 0 !important; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - padding-bottom: 5px; -} - -.item__active + .item { - border-top: 1px solid transparent; -} - -.itemLink { - color: #444; - display: inline-block; - font-family: var(--mm-font-stack-display); - font-size: 16px; - font-weight: 700; - padding: calc(var(--mm-spacing) * 0.25) calc(var(--mm-spacing) * 0.25); - text-decoration: none; - transition: all 0.15s ease-out; - width: 100%; - - &:hover { - background: rgba(255, 255, 255, 0.5); - } -} - -.itemIcon { - border-radius: var(--mm-border-radius); - box-shadow: inset 0 0 0 3px rgba(255, 255, 255, 0.35); - height: 40px; - width: 40px; - - &::before { - border-radius: var(--mm-border-radius); - } -} - -.item:not(.item__active) .itemIcon { - background: none; - border: 0; - box-shadow: none; - - &::before { - background: none; - } - - svg { - fill: var(--mm-color-primary-text); - filter: none; - } -} - -.item__active .itemLink { - background: transparent; - border: 0; - border-left: 4px solid transparent; - color: var(--mm-color-primary-text); - font-weight: 500; - - &:hover { - color: var(--mm-color-display-text); - } -} - -.item__active .list { - display: block; -} - -.externalLinkIcon { - margin-left: 5px; - transform: translateY(-1px); -} - -.list__level0 > .item > .itemLink { - border-left: 0; - column-gap: calc(var(--mm-spacing) / 4); - display: grid; - grid-template-columns: max-content auto; - grid-template-rows: auto auto; -} - -.list__level0 > .item__active > .itemLink { - color: var(--mm-color-display-text); - font-weight: 700; -} - -.list__level0 > .item > .itemLink > * { - align-self: center; -} - -.list__level1 { - display: none; -} - -.list__level1 .item { - border-top: 0; -} - -.list__level1 .item:last-of-type { - margin-bottom: calc(var(--mm-spacing) / 2); -} - -.list__level1 .item__hasDivider::before { - border-top: 1px dashed var(--mm-color-border); - content: ' '; - display: block; - height: 0; - margin: calc(var(--mm-spacing) / 2) 0; - width: 100%; -} - -/* stylelint-disable-next-line no-descending-specificity */ -.list__level1 .itemLink { - color: var(--mm-color-primary-text); - font-size: 14px; - font-weight: 500; - margin-left: 46px; - max-width: calc(100% - 46px); - padding: 5px 10px; - - &:hover { - color: var(--mm-color-display-text); - } -} - -.list__level1 .item__active { - border: 0; - box-shadow: none; - padding-bottom: 0; -} - -.list__level1 .item__current > .itemLink { - background: var(--mm-color-sidebar); - border-left: 4px solid var(--mm-color-active-blue); - color: var(--mm-color-display-text) !important; -} - -.list__level1 [href*='#']:focus { - position: relative; -} - -.list__level1 [href*='#']:focus::before { - background: var(--mm-color-active-blue); - border-radius: 50%; - content: ' '; - display: block; - height: 6px; - left: 0; - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 6px; -} - -/* stylelint-disable-next-line no-descending-specificity */ -.list__level2 .item { - margin-left: calc(var(--mm-spacing) / 2); -} - -.list__level2 .item:last-of-type { - margin-bottom: 0; -} - -.item__nonProduct.item__current { - background-color: var(--mm-color-sidebar); -} - -.item__nonProduct.item__current > .itemLink { - background: var(--mm-color-background); -} - -@include variables.breakpoint('lg') { - .sidebar { - border-left: 0; - grid-area: sidebar; - position: relative; - transform: initial !important; - transition: none; - - &::after { - background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.1) 100%); - content: ' '; - display: block; - height: 100%; - position: absolute; - right: 0; - top: 0; - width: 5px; - } - } - - .nav { - height: 100%; - margin: var(--mm-spacing) 0; - max-height: calc(100vh - calc(var(--page-header-height) + 41px)); - top: calc(var(--page-header-height) + var(--mm-spacing)); - } - - .list__level0 > .item > .itemLink { - padding-left: 30px; - padding-right: 30px; - } - - /* stylelint-disable-next-line no-descending-specificity */ - .list__level1 .itemLink { - margin-left: 66px; - max-width: calc(100% - 66px); - } -} diff --git a/src/components/Layout/Sidebar.tsx b/src/components/Layout/Sidebar.tsx deleted file mode 100644 index 2e855a094..000000000 --- a/src/components/Layout/Sidebar.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { useLocation } from '@reach/router'; -import classNames from 'classnames'; -import React from 'react'; -import { FaExternalLinkAlt as ExternalLinkIcon } from 'react-icons/fa'; - -import navigation from '../../../content/navigation'; -import { - IItem, - isInternalItem, -} from '../../types/Item'; -import Link from '../Link'; - -import * as styles from './Sidebar.module.scss'; - -const renderItems = ( - items: IItem[], - currentPath: string, - level = 0 -): React.ReactElement => ( -
      - {items.map((item, index) => { - let isItemActive = false; - let isItemCurrent = false; - let isItemNonProduct = false; - - if (isInternalItem(item)) { - isItemActive = currentPath.startsWith(item.to); - isItemCurrent = currentPath === item.to; - isItemNonProduct = !item.to.startsWith('/minfraud') - && !item.to.startsWith('/geoip'); - } - - if (item.icon) { - item.icon = React.cloneElement(item.icon, { - className: classNames( - styles.itemIcon, - ), - }); - } - - return ( -
    • - {isInternalItem(item) ? ( - <> - - {item.icon} - - {item.title} - - - - {item.items && renderItems(item.items, currentPath, level + 1)} - - {isItemActive - && item.secondaryItems - && renderItems(item.secondaryItems, currentPath, level + 1) - } - - ) : ( - - {item.icon} - - {item.title} - - - - )} -
    • - ); - } - )} -
    -); - -const Sidebar: React.FC = () => { - let pathname = useLocation().pathname; - - if (pathname.slice(pathname.length -1) === '/') { - pathname = pathname.slice(0, -1); - } - - return ( -
    - -
    - ); -}; - -export default Sidebar; diff --git a/src/components/Layout/index.ts b/src/components/Layout/index.ts deleted file mode 100644 index 67fc7d38d..000000000 --- a/src/components/Layout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as default } from './Layout'; diff --git a/src/components/Link.tsx b/src/components/Link.tsx deleted file mode 100644 index de6043fcc..000000000 --- a/src/components/Link.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { GatsbyLinkProps, Link as GatsbyLink } from 'gatsby'; -import * as React from 'react'; - -type ILink = Omit>,'ref'> - -const Link: React.FC = (props) => { - const { to, ...rest } = props; - - return ( - - ); -}; - -export default Link; diff --git a/src/components/LinkButton.module.scss b/src/components/LinkButton.module.scss deleted file mode 100644 index c97a6b321..000000000 --- a/src/components/LinkButton.module.scss +++ /dev/null @@ -1,41 +0,0 @@ -@use '../styles/variables'; - -.link { - align-items: center; - background: linear-gradient(var(--mm-color-background), var(--mm-color-sidebar)); - border-radius: 4px; - box-shadow: rgb(0 0 0 / 10%) 0 1px 3px 0, rgb(0 0 0 / 6%) 0 1px 2px 0; - color: var(--mm-color-primary-text); - display: grid; - font-family: var(--mm-font-stack-display); - font-size: 14px; - font-weight: 400; - gap: 10px; - grid-auto-flow: column; - grid-template-columns: max-content auto; - overflow: hidden; - padding: 12px 10px 8px; - position: relative; - text-decoration: none; - top: 0; - transition: all 0.1s ease-in-out; - @include variables.pattern-border; - - &::after, - &::before { - height: 4px !important; - } - - &:hover { - background-color: var(--mm-color-active-blue); - box-shadow: rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - top: -2px; - } -} - -.icon { - border-right: 1px solid var(--mm-color-border); - color: var(--mm-color-active-blue); - display: inline-block; - padding-right: 10px; -} diff --git a/src/components/LinkButton.tsx b/src/components/LinkButton.tsx deleted file mode 100644 index bd5cde31a..000000000 --- a/src/components/LinkButton.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import Link from './Link'; - -import * as styles from './LinkButton.module.scss'; - -interface ILinkButton { - Icon?: React.FC>; - children?: React.ReactNode; - text?: string; - to: string; -} - -const LinkButton: React.FC = (props) => { - const { children, Icon, text, to } = props; - return ( - - {Icon && ( - - - - )} - {text || children} - - ); -}; - -LinkButton.propTypes = { - Icon: PropTypes.any, - children: PropTypes.node, - text: PropTypes.string, - to: PropTypes.string.isRequired, -}; - -export default LinkButton; diff --git a/src/components/LinkGroup/LinkGroup.module.scss b/src/components/LinkGroup/LinkGroup.module.scss deleted file mode 100644 index defa4117a..000000000 --- a/src/components/LinkGroup/LinkGroup.module.scss +++ /dev/null @@ -1,94 +0,0 @@ -@use '../../styles/variables'; - -.section { - margin-top: var(--mm-spacing); -} - -.sectionHeading { - color: var(--mm-color-primary-text); - font-size: 18px; - font-weight: 500; - margin-bottom: 20px; -} - -.cards { - display: grid; - gap: var(--mm-spacing); - grid-template-areas: - 'first' - 'second'; - grid-template-columns: 1fr; - grid-template-rows: auto; -} - -.cards:nth-of-type(1) { - grid-area: first; -} - -.cards:nth-of-type(2) { - grid-area: second; -} - -.cards__isCompact { - gap: calc(var(--mm-spacing) / 2); - grid-template-columns: 1fr; - grid-template-rows: auto; -} - -.card { - width: 100%; -} - -@include variables.breakpoint('sm') { - .cards__isCompact { - grid-template-areas: 'first second'; - grid-template-columns: 1fr 1fr; - } -} - -@include variables.breakpoint('md') { - .cards { - grid-template-areas: 'first second'; - grid-template-columns: 1fr 1fr; - } - - .cards__isCompact { - grid-template-areas: 'first second third'; - grid-template-columns: 1fr 1fr 1fr; - } - - .cards__isCompact:nth-of-type(3) { - grid-area: third; - } -} - -@include variables.breakpoint('lg') { - .cards { - grid-template-areas: - 'first' - 'second'; - grid-template-columns: 1fr; - } - - .cards__isCompact { - gap: calc(var(--mm-spacing) / 2); - grid-template-areas: 'first second'; - grid-template-columns: 1fr 1fr; - } -} - -@include variables.breakpoint('xl') { - .cards { - grid-template-areas: 'first second'; - grid-template-columns: 1fr 1fr; - } - - .cards__isCompact { - grid-template-areas: 'first second third'; - grid-template-columns: 1fr 1fr 1fr; - } - - .cards__isCompact:nth-of-type(3) { - grid-area: third; - } -} diff --git a/src/components/LinkGroup/LinkGroup.tsx b/src/components/LinkGroup/LinkGroup.tsx deleted file mode 100644 index 2aca7302e..000000000 --- a/src/components/LinkGroup/LinkGroup.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { ILinkGroupCard } from './LinkGroupCard'; - -import * as styles from './LinkGroup.module.scss'; - -export interface ILinkGroup { - children: React.ReactElement - | React.ReactElement[]; - heading?: string; - isCompact?: boolean -} - -const LinkGroup: React.FC = (props) => ( -
    - {props.heading && ( -

    - {props.heading} -

    - )} -
    - {React.Children.map( - props.children, - ( - child: React.ReactElement, - index: number, - ) => React.cloneElement((child), { - className: styles.card, - isCompact: props.isCompact, - key: `link-group-child-${index}`, - }) - )} -
    -
    -); - -LinkGroup.propTypes = { - children: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.element.isRequired).isRequired, - PropTypes.element.isRequired, - ]).isRequired, - heading: PropTypes.string, - isCompact: PropTypes.bool, -}; - -export default LinkGroup; diff --git a/src/components/LinkGroup/LinkGroupCard.module.scss b/src/components/LinkGroup/LinkGroupCard.module.scss deleted file mode 100644 index 923b8b49d..000000000 --- a/src/components/LinkGroup/LinkGroupCard.module.scss +++ /dev/null @@ -1,100 +0,0 @@ -@use '../../styles/variables'; - -.container { - background: linear-gradient(#fff, var(--mm-color-sidebar)); - border: 1px solid #eee; - border-bottom: 1px solid #ddd; - border-radius: var(--mm-border-radius); - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 3px 0, rgba(0, 0, 0, 0.06) 0 1px 2px 0; - display: grid; - gap: calc(var(--mm-spacing) / 2); - grid-template-areas: - 'icon heading arrow' - '. description arrow'; - grid-template-columns: min-content 1fr min-content; - grid-template-rows: auto; - margin-top: 0; - overflow: hidden; - padding: calc(var(--mm-spacing) / 2); - padding-top: calc(calc(var(--mm-spacing) / 2) + 6px); - position: relative; - text-decoration: none; - top: 0; - transition: all 0.1s ease-in-out; - @include variables.pattern-border; - - &::before, - &::after { - height: 6px !important; - } - - &:hover { - box-shadow: rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - top: -5px; - } -} - -.container__isCompact { - gap: calc(var(--mm-spacing) / 4); - grid-template-columns: min-content 1fr min-content; - grid-template-rows: auto; - padding: calc(var(--mm-spacing) / 4); - padding-top: calc(calc(var(--mm-spacing) / 4) + 6px); -} - -.container__noDescription { - grid-template-areas: 'icon heading arrow'; -} - -.icon { - align-self: center; - color: var(--mm-color-active-blue); - grid-area: icon; - height: 30px; - width: 30px; -} - -.container__isCompact .icon { - height: 18px; - width: 18px; -} - -.heading { - align-self: center; - color: var(--mm-color-display-text); - font-size: 18px; - font-weight: 500; - grid-area: heading; -} - -.container__isCompact .heading { - font-size: 14px; -} - -.description { - color: var(--mm-color-primary-text); - font-size: 14px; - grid-area: description; -} - -.container__isCompact .description { - font-size: 12px; -} - -.arrow { - border-left: 1px solid var(--mm-color-border); - color: var(--mm-color-active-blue); - display: grid; - grid-area: arrow; - height: 100%; - padding-left: calc(var(--mm-spacing) / 2); - - > * { - align-self: center; - } -} - -.container__isCompact .arrow { - font-size: 14px; - padding-left: calc(var(--mm-spacing) / 4); -} diff --git a/src/components/LinkGroup/LinkGroupCard.tsx b/src/components/LinkGroup/LinkGroupCard.tsx deleted file mode 100644 index 4f67cc8ce..000000000 --- a/src/components/LinkGroup/LinkGroupCard.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; -import { IconType } from 'react-icons'; -import { FaArrowRight } from 'react-icons/fa'; - -import Link from '../Link'; - -import * as styles from './LinkGroupCard.module.scss'; - -export interface ILinkGroupCard { - className?: string; - description?: string; - heading: string; - icon: IconType, - isCompact?: boolean, - to: string; -} - -const LinkGroupCard: React.FC = (props) => { - const { className, description, icon: Icon, isCompact, to } = props; - return ( - - -

    - {props.heading} -

    - {description && ( -

    - {description} -

    - )} -
    - -
    - - ); -}; - -LinkGroupCard.propTypes = { - className: PropTypes.string, - description: PropTypes.string, - heading: PropTypes.string.isRequired, - icon: PropTypes.any.isRequired, - isCompact: PropTypes.bool, - to: PropTypes.string.isRequired, -}; - -export default LinkGroupCard; diff --git a/src/components/LinkGroup/LinkGroupContainer.module.scss b/src/components/LinkGroup/LinkGroupContainer.module.scss deleted file mode 100644 index debba877a..000000000 --- a/src/components/LinkGroup/LinkGroupContainer.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.container { - display: block; -} diff --git a/src/components/LinkGroup/LinkGroupContainer.tsx b/src/components/LinkGroup/LinkGroupContainer.tsx deleted file mode 100644 index 6705e61da..000000000 --- a/src/components/LinkGroup/LinkGroupContainer.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { ILinkGroup } from './LinkGroup'; - -import * as styles from './LinkGroupContainer.module.scss'; - -interface ILinkGroupContainer { - children: React.ReactElement | React.ReactElement[], -} - -const LinkGroupContainer: React.FC = (props) => { - return( -
    - {props.children} -
    - ); -}; - -LinkGroupContainer.propTypes = { - children: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.element.isRequired).isRequired, - PropTypes.element.isRequired, - ]).isRequired, -}; - -export default LinkGroupContainer; diff --git a/src/components/LinkGroup/index.ts b/src/components/LinkGroup/index.ts deleted file mode 100644 index 07d94f462..000000000 --- a/src/components/LinkGroup/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as LinkGroup } from './LinkGroup'; -export { default as LinkGroupCard } from './LinkGroupCard'; -export { default as LinkGroupContainer } from './LinkGroupContainer'; diff --git a/src/components/Loading.module.scss b/src/components/Loading.module.scss deleted file mode 100644 index ea084b7f7..000000000 --- a/src/components/Loading.module.scss +++ /dev/null @@ -1,103 +0,0 @@ -.image, -.dotContainer { - height: 100px; - position: relative; - width: 100px; -} - -.image { - animation: anirotate 10s linear infinite; - transform-origin: center; -} - -.dot { - background: var(--mm-color-logo-blue-light); - border-radius: 5px; - height: 10px; - position: absolute; - transform: translate(0, 0); - width: 10px; - - &:nth-child(1) { - animation: ani1 2s infinite; - left: calc(50% - 5px); - top: 0; - } - - &:nth-child(2) { - animation: ani2 2s infinite; - bottom: calc(28% - 5px); - left: calc(11% - 5px); - } - - &:nth-child(3) { - animation: ani3 2s infinite; - bottom: calc(28% - 5px); - right: calc(11% - 5px); - - } -} - -.dotContainer { - border: 0 solid var(--mm-color-logo-blue-light); - border-radius: 50px; - position: absolute; - - &:nth-child(2) { - .dot { - animation-delay: -0.5s; - } - transform: rotate(40deg); - } - - &:nth-child(3) { - .dot { - animation-delay: -1s; - } - transform: rotate(80deg); - } -} - -@keyframes anirotate { - 0% { - transform: rotate(0deg); - - } - - 100% { - transform: rotate(-359deg); - } -} - -@keyframes ani1 { - 0% { - transform: translate(0, 0); - - } - - 100% { - transform: translate(-40px, 67px); - } -} - -@keyframes ani2 { - 0% { - transform: translate(0, 0); - - } - - 100% { - transform: translate(77px, 0); - } -} - -@keyframes ani3 { - 0% { - transform: translate(0, 0); - - } - - 100% { - transform: translate(-39px, -67px); - } -} diff --git a/src/components/Loading.tsx b/src/components/Loading.tsx deleted file mode 100644 index 44a558d5c..000000000 --- a/src/components/Loading.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; - -import * as styles from './Loading.module.scss'; - -const Loading: React.FC = () => ( -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -); - -export default Loading; diff --git a/src/components/Mdx/A.module.scss b/src/components/Mdx/A.module.scss deleted file mode 100644 index 565560d79..000000000 --- a/src/components/Mdx/A.module.scss +++ /dev/null @@ -1,20 +0,0 @@ -@use '../../styles/variables'; - -.a { - align-items: center; - border-bottom: 2px dotted var(--mm-color-display-text); - color: var(--mm-color-display-text); - font-weight: 500; - height: 20px; - padding-bottom: 2px; - text-decoration: none; -} - -a:hover { - border-bottom-style: solid; -} - -.icon { - margin-left: 5px; - transform: translateY(-2px); -} diff --git a/src/components/Mdx/A.tsx b/src/components/Mdx/A.tsx deleted file mode 100644 index e2ccaf67b..000000000 --- a/src/components/Mdx/A.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaExternalLinkAlt } from 'react-icons/fa'; - -import Link from '../Link'; - -import * as styles from './A.module.scss'; - -const A: React.FC> = (props) => { - const { className, children, href, target, ...rest } = props; - let isEmail = false; - let targetHref = href; - - // remark-external-links sets target='_blank' - const isExternal = target === '_blank'; - - if (targetHref) { - isEmail = targetHref.startsWith('mailto'); - - // Get rid of trailing non-alpha characters like commas and periods. - if (isEmail && targetHref.slice(targetHref.length -1).match(/[^a-z]/i)) { - targetHref = targetHref.slice(0, -1); - } - } - - return ( - <> - { (isExternal || isEmail) && - - {children} - - {!isEmail && ( - - )} - - } - { !isExternal && !isEmail && ( - - {children} - - )} - - ); -}; - -A.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - href: PropTypes.string, - target: PropTypes.string, -}; - -export default A; diff --git a/src/components/Mdx/Blockquote.module.scss b/src/components/Mdx/Blockquote.module.scss deleted file mode 100644 index 4e1b32dcb..000000000 --- a/src/components/Mdx/Blockquote.module.scss +++ /dev/null @@ -1,34 +0,0 @@ -@use '../../styles/variables'; - -.wrapper { - border-left: 0; - border-right: 0; - padding: var(--mm-spacing); - position: relative; -} - -.blockquote { - position: relative; - z-index: 3; - - p { - font-family: var(--mm-font-stack-display); - font-size: 20px; - font-style: italic; - font-weight: 500; - line-height: 1.5em; - text-align: center; - } - - > p:first-of-type { - margin-top: 0; - } - - > p:last-of-type { - margin-bottom: 0; - } - - .blockquote:last-of-type { - margin-bottom: 0; - } -} diff --git a/src/components/Mdx/Blockquote.tsx b/src/components/Mdx/Blockquote.tsx deleted file mode 100644 index f33a6e5fa..000000000 --- a/src/components/Mdx/Blockquote.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Blockquote.module.scss'; - -const Blockquote: React.FC> = ({ - className, - ...props -}) => ( -
    -
    - {props.children} -
    -
    -); - -Blockquote.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Blockquote; diff --git a/src/components/Mdx/Code.module.scss b/src/components/Mdx/Code.module.scss deleted file mode 100644 index a14693d7b..000000000 --- a/src/components/Mdx/Code.module.scss +++ /dev/null @@ -1,21 +0,0 @@ -@use '../../styles/variables'; - -.code { - background: #fff; - border: 1px solid var(--mm-color-border); - border-radius: 4px; - color: var(--mm-color-display-text); - font-family: var(--mm-font-stack-monospace); - font-size: 14px; - font-weight: 700; - padding: 2px 6px; - transition: background-color 0.2s ease-out; -} - -a > .code { - padding-bottom: 0; -} - -.code:hover { - background: #f5f5f5; -} diff --git a/src/components/Mdx/Code.tsx b/src/components/Mdx/Code.tsx deleted file mode 100644 index e76135fc3..000000000 --- a/src/components/Mdx/Code.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Code.module.scss'; - -const Code: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Code.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Code; diff --git a/src/components/Mdx/Del.module.scss b/src/components/Mdx/Del.module.scss deleted file mode 100644 index 0778ab0e5..000000000 --- a/src/components/Mdx/Del.module.scss +++ /dev/null @@ -1,4 +0,0 @@ -.del { - /* stylelint-disable-next-line plugin/no-unsupported-browser-features */ - text-decoration-color: #333; -} diff --git a/src/components/Mdx/Del.tsx b/src/components/Mdx/Del.tsx deleted file mode 100644 index f54f1e8d1..000000000 --- a/src/components/Mdx/Del.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Del.module.scss'; - -const Del: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Del.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Del; diff --git a/src/components/Mdx/Em.module.scss b/src/components/Mdx/Em.module.scss deleted file mode 100644 index 09923e01e..000000000 --- a/src/components/Mdx/Em.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.em { - font-style: italic; -} diff --git a/src/components/Mdx/Em.tsx b/src/components/Mdx/Em.tsx deleted file mode 100644 index 0563d256c..000000000 --- a/src/components/Mdx/Em.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Em.module.scss'; - -const Em: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Em.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Em; diff --git a/src/components/Mdx/H1.module.scss b/src/components/Mdx/H1.module.scss deleted file mode 100644 index 61e022e5b..000000000 --- a/src/components/Mdx/H1.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use '../../styles/variables'; - -.h1 { - @include variables.heading; - font-size: 28px; - font-weight: 600; - margin: var(--mm-spacing); - margin-top: 0; - padding-top: var(--mm-spacing); -} - -@include variables.breakpoint('md') { - .h1 { - font-size: 42px; - } -} diff --git a/src/components/Mdx/H1.tsx b/src/components/Mdx/H1.tsx deleted file mode 100644 index 35205b520..000000000 --- a/src/components/Mdx/H1.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './H1.module.scss'; - -const H1: React.FC> = ({ - className, - ...props -}) => ( -

    - {props.children} -

    -); - -H1.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default H1; diff --git a/src/components/Mdx/H2.module.scss b/src/components/Mdx/H2.module.scss deleted file mode 100644 index 9e106cedf..000000000 --- a/src/components/Mdx/H2.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -@use '../../styles/variables'; - -.h2 { - @include variables.heading; - font-size: 24px; - font-weight: 700; -} diff --git a/src/components/Mdx/H2.tsx b/src/components/Mdx/H2.tsx deleted file mode 100644 index 90af7d851..000000000 --- a/src/components/Mdx/H2.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaLink } from 'react-icons/fa'; - -import * as styles from './H2.module.scss'; - -const H2: React.FC> = ({ - className, - ...props -}) => ( -

    - - {props.children} - - -

    -); - -H2.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - id: PropTypes.string, -}; - -export default H2; diff --git a/src/components/Mdx/H3.module.scss b/src/components/Mdx/H3.module.scss deleted file mode 100644 index 5c1c2bba9..000000000 --- a/src/components/Mdx/H3.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -@use '../../styles/variables'; - -.h3 { - @include variables.heading; - font-size: 20px; -} diff --git a/src/components/Mdx/H3.tsx b/src/components/Mdx/H3.tsx deleted file mode 100644 index f9bd01855..000000000 --- a/src/components/Mdx/H3.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaLink } from 'react-icons/fa'; - -import * as styles from './H3.module.scss'; - -const H3: React.FC> = ({ - className, - ...props -}) => ( -

    - - {props.children} - - -

    -); - -H3.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - id: PropTypes.string, -}; - -export default H3; diff --git a/src/components/Mdx/H4.module.scss b/src/components/Mdx/H4.module.scss deleted file mode 100644 index caa5dab66..000000000 --- a/src/components/Mdx/H4.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -@use '../../styles/variables'; - -.h4 { - @include variables.heading; - font-size: 18px; -} diff --git a/src/components/Mdx/H4.tsx b/src/components/Mdx/H4.tsx deleted file mode 100644 index 8a704147f..000000000 --- a/src/components/Mdx/H4.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaLink } from 'react-icons/fa'; - -import * as styles from './H4.module.scss'; - -const H4: React.FC> = ({ - className, - ...props -}) => ( -

    - - {props.children} - - -

    -); - -H4.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - id: PropTypes.string, -}; - -export default H4; diff --git a/src/components/Mdx/H5.module.scss b/src/components/Mdx/H5.module.scss deleted file mode 100644 index aac04e32e..000000000 --- a/src/components/Mdx/H5.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -@use '../../styles/variables'; - -.h5 { - @include variables.heading; - font-size: 16px; -} diff --git a/src/components/Mdx/H5.tsx b/src/components/Mdx/H5.tsx deleted file mode 100644 index bed6befab..000000000 --- a/src/components/Mdx/H5.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaLink } from 'react-icons/fa'; - -import * as styles from './H5.module.scss'; - -const H5: React.FC> = ({ - className, - ...props -}) => ( -
    - - {props.children} - - -
    -); - -H5.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - id: PropTypes.string, -}; - -export default H5; diff --git a/src/components/Mdx/H6.module.scss b/src/components/Mdx/H6.module.scss deleted file mode 100644 index 8066b37ff..000000000 --- a/src/components/Mdx/H6.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -@use '../../styles/variables'; - -.h6 { - @include variables.heading; - font-size: 16px; - text-transform: uppercase; - - a { - color: rgba(57, 61, 100, 0.5) !important; - } -} diff --git a/src/components/Mdx/H6.tsx b/src/components/Mdx/H6.tsx deleted file mode 100644 index 518e7145e..000000000 --- a/src/components/Mdx/H6.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaLink } from 'react-icons/fa'; - -import * as styles from './H6.module.scss'; - -const H6: React.FC> = ({ - className, - ...props -}) => ( -
    - - {props.children} - - -
    -); - -H6.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, - id: PropTypes.string, -}; - -export default H6; diff --git a/src/components/Mdx/Hr.module.scss b/src/components/Mdx/Hr.module.scss deleted file mode 100644 index e696b09ad..000000000 --- a/src/components/Mdx/Hr.module.scss +++ /dev/null @@ -1,10 +0,0 @@ -@use '../../styles/variables'; - -.hr { - border: 0; - border-top: 1px dashed var(--mm-color-border); - height: 0; - margin: var(--mm-spacing) auto; - padding: 0 !important; - width: 200px; -} diff --git a/src/components/Mdx/Hr.tsx b/src/components/Mdx/Hr.tsx deleted file mode 100644 index f4a0b7a2e..000000000 --- a/src/components/Mdx/Hr.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Hr.module.scss'; - -const Hr: React.FC> = ({ - className, - ...props -}) => ( -
    -); - -Hr.propTypes = { - className: PropTypes.string, -}; - -export default Hr; diff --git a/src/components/Mdx/Img.module.scss b/src/components/Mdx/Img.module.scss deleted file mode 100644 index 51acbe356..000000000 --- a/src/components/Mdx/Img.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.img { - margin: 0 40px; -} diff --git a/src/components/Mdx/Img.tsx b/src/components/Mdx/Img.tsx deleted file mode 100644 index 086ac76b1..000000000 --- a/src/components/Mdx/Img.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import classNames from 'classnames'; -import { graphql,useStaticQuery } from 'gatsby'; -import { GatsbyImage } from 'gatsby-plugin-image'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Img.module.scss'; - -const Img: React.FC> = (props) => { - const data = useStaticQuery(graphql`{ - placeholderImage: file(relativePath: {eq: "gatsby-astronaut.png"}) { - childImageSharp { - gatsbyImageData(width: 300, layout: CONSTRAINED) - } - } -} -`); - - return ( - - ); -}; - -Img.propTypes = { - alt: PropTypes.string, - className: PropTypes.string, - title: PropTypes.string, -}; - -export default Img; diff --git a/src/components/Mdx/Li.module.scss b/src/components/Mdx/Li.module.scss deleted file mode 100644 index 560d029b3..000000000 --- a/src/components/Mdx/Li.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -@use '../../styles/variables'; - -.li { - font-size: 16px; - line-height: 26px; - margin-bottom: calc(var(--mm-spacing) / 3); -} - -.li::marker { - color: #ccc; -} diff --git a/src/components/Mdx/Li.tsx b/src/components/Mdx/Li.tsx deleted file mode 100644 index 91d919a3d..000000000 --- a/src/components/Mdx/Li.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Li.module.scss'; - -const Li: React.FC> = ({ - className, - ...props -}) => ( -
  • - {props.children} -
  • -); - -Li.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Li; diff --git a/src/components/Mdx/Ol.module.scss b/src/components/Mdx/Ol.module.scss deleted file mode 100644 index 695580177..000000000 --- a/src/components/Mdx/Ol.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -@use '../../styles/variables'; - -.ol { - list-style-type: decimal; - margin: calc(var(--mm-spacing) / 2) var(--mm-spacing); - padding-left: calc(var(--mm-spacing) / 2); -} - -.ol .ol { - margin: calc(var(--mm-spacing) / 4) 0; -} diff --git a/src/components/Mdx/Ol.tsx b/src/components/Mdx/Ol.tsx deleted file mode 100644 index fc5f32679..000000000 --- a/src/components/Mdx/Ol.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Ol.module.scss'; - -// Using React.HTMLProps throws an error -const Ol: React.FC> = ({ - className, - ...props -}) => ( -
      - {props.children} -
    -); - -Ol.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Ol; diff --git a/src/components/Mdx/P.module.scss b/src/components/Mdx/P.module.scss deleted file mode 100644 index 4e2327b63..000000000 --- a/src/components/Mdx/P.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use '../../styles/variables'; - -.p { - color: var(--mm-color-primary-text); - font-size: 16px; - line-height: 26px; - margin: calc(var(--mm-spacing) / 2) 0; -} diff --git a/src/components/Mdx/P.tsx b/src/components/Mdx/P.tsx deleted file mode 100644 index d1acf3ebf..000000000 --- a/src/components/Mdx/P.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './P.module.scss'; - -const P: React.FC> = ({ - className, - ...props -}) => ( -

    - {props.children} -

    -); - -P.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default P; diff --git a/src/components/Mdx/Pre/Button.module.scss b/src/components/Mdx/Pre/Button.module.scss deleted file mode 100644 index d71a125ab..000000000 --- a/src/components/Mdx/Pre/Button.module.scss +++ /dev/null @@ -1,39 +0,0 @@ -.button { - background: none; - border: 0; - border-left: 1px solid rgba(255, 255, 255, 0.2); - border-right: 1px solid rgba(0, 0, 0, 0.2); - color: #ccc; - cursor: pointer; - font-size: 12px; - font-weight: 500; - height: 100%; - letter-spacing: 1px; - padding: 0 calc(var(--mm-spacing) / 4); - position: relative; -} - -.button:hover { - background: rgba(255, 255, 255, 0.07); - color: #ddd; -} - -.button:first-of-type { - border-radius: var(--mm-border-radius) 0 0 0; -} - -.button:last-of-type::after { - background-color: rgba(255, 255, 255, 0.2); - content: ' '; - display: inline-block; - height: 100%; - position: absolute; - right: -2px; - top: 0; - width: 1px; -} - -.button.active { - background: rgba(255, 255, 255, 0.16); - color: #fff; -} diff --git a/src/components/Mdx/Pre/Button.tsx b/src/components/Mdx/Pre/Button.tsx deleted file mode 100644 index 54a156be2..000000000 --- a/src/components/Mdx/Pre/Button.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Button.module.scss'; - -interface IButton { - children: React.ReactNode; - className?: string; - isActive?: boolean; -} - -const Button: React.FC< - IButton & React.HTMLProps -> = (props) => { - const { children, className, isActive, ...rest } = props; - - return ( - - ); -}; - -Button.propTypes = { - children: PropTypes.any.isRequired, - className: PropTypes.string, - isActive: PropTypes.bool, -}; - -export default Button; diff --git a/src/components/Mdx/Pre/Code.dark-theme.css b/src/components/Mdx/Pre/Code.dark-theme.css deleted file mode 100644 index 02a081311..000000000 --- a/src/components/Mdx/Pre/Code.dark-theme.css +++ /dev/null @@ -1,274 +0,0 @@ -/* stylelint-disable */ -code[class*='language-'], -pre[class*='language-'] { - color: #b3bac6; - font-family: var(--mm-font-stack-monospace); - font-size: 14px; - - hyphens: none; - line-height: 1.5em; - - tab-size: 2; - text-align: left; - white-space: pre; - word-break: normal; - word-spacing: normal; - word-wrap: normal; -} - -code[class*='language-'] ::selection, -pre[class*='language-'] ::selection { - background: rgba(255, 255, 255, 0.08); -} - -code[class*='language-'] ::selection, -pre[class*='language-'] ::selection { - background: rgba(255, 255, 255, 0.08); -} - -:not(pre) > code[class*='language-'] { - border-radius: 0.2em; - padding: 0.1em; - white-space: normal; -} - -pre[class*='language-'] { - margin: 0.5em 0; - overflow: auto; - padding: calc(var(--mm-spacing) / 2); - position: relative; -} - -.language-css > code, -.language-javascript > code, -.language-sass > code, -.language-scss > code { - color: #e9c782; -} - -.language-typescript > code { - color: #e5767e; -} - -[class*='language-'] .namespace { - opacity: 0.7; -} - -.token.atrule { - color: #cd83e3; -} - -.token.attr-name { - color: #e9c782; -} - -.token.attr-value { - color: #a2ca82; -} - -.token.attribute { - color: #a2ca82; -} - -.token.boolean { - color: #e9c782; -} - -.token.builtin { - color: #e9c782; -} - -.token.cdata { - color: #80cbc4; -} - -.token.char { - color: #80cbc4; -} - -.token.class { - color: #e9c782; -} - -.token.class-name { - color: #e9c782; -} - -.token.color { - color: #e9c782; -} - -.token.comment { - color: #898e98; - font-style: italic; -} - -.token.constant { - color: #e9c782; -} - -.token.deleted { - color: #e5767e; -} - -.token.doctype { - color: #546e7a; -} - -.token.entity { - color: #e5767e; -} - -.token.function { - color: #6ab9f3; -} - -.token.hexcode { - color: #e9c782; -} - -.token.id { - color: #cd83e3; -} - -.token.important { - color: #cd83e3; -} - -.token.interpolation-punctuation.punctuation { - color: #cd83e3; -} - -.token.inserted { - color: #80cbc4; -} - -.token.keyword { - color: #cd83e3; -} - -.token.number { - color: #e9c782; -} - -.token.operator { - color: #5ab2be; -} - -.language-javascript .token.operator, -.language-typescript .token.operator { - color: #b4bbc7; -} - -.token.prolog { - color: #546e7a; -} - -.token.parameter { - color: #e5767e; -} - -.token.property { - color: #e5767e; -} - -.token.pseudo-class { - color: #a2ca82; -} - -.token.pseudo-element { - color: #a2ca82; -} - -.token.punctuation { - color: #b4bbc7; -} - -.token.regex { - color: #e9c782; -} - -.token.selector { - color: #e5767e; -} - -.token.string { - color: #a2ca82; -} - -.token.symbol { - color: #c792ea; -} - -.token.tag { - color: #e5767e; -} - -.token.unit { - color: #e5767e; -} - -.token.url { - color: #e5767e; -} - -.token.variable { - color: #e5767e; -} - -.line-numbers .line-numbers-rows { - border-color: transparent !important; - font-family: var(--mm-font-stack-monospace) !important; - font-size: 18px; -} - -.line-numbers-rows > span::before { - color: #898e98 !important; -} - -.token.tab::before { - content: '\279D' !important; -} - -.token.tab:not(:empty)::before, -.token.cr::before, -.token.crlf::before, -.token.lf::before, -.token.space::before { - color: #58577e !important; - opacity: 1 !important; -} - -.token.cr::before, -.token.crlf::before, -.token.lf::before { - display: none; -} - -.token.indent { - border-left: 1px solid #58577e; - margin-left: 4px; - padding-left: 4px; -} - -.token.indent:blank { - display: none; -} - -.token.indent .token.space:nth-of-type(2n), -.token.indent .token.tab { - border-right: 1px solid #58577e; - margin-right: 4px; - padding-right: 4px; -} - -.token.indent .token.space:last-of-type, -.token.indent .token.tab:last-of-type { - border-right: 0; - margin-right: 0; -} - -.line-highlight { - background: rgba(255, 255, 255, 0.05) !important; - background: linear-gradient(90deg, rgba(255, 255, 255, 0.07) 0%, rgba(255, 255, 255, 0)) !important; -} diff --git a/src/components/Mdx/Pre/Code.module.scss b/src/components/Mdx/Pre/Code.module.scss deleted file mode 100644 index e64ede844..000000000 --- a/src/components/Mdx/Pre/Code.module.scss +++ /dev/null @@ -1,82 +0,0 @@ -/* stylelint-disable */ -@use '../../../styles/variables'; - -.container { - background-color: var(--mm-color-background-code); - border-left: 1px solid rgba(255, 255, 255, 0.1); - border-radius: var(--mm-border-radius); - border-right: 1px solid rgba(255, 255, 255, 0.1); - border-top: 1px solid rgba(255, 255, 255, 0.3); - padding: 5px; - position: relative; - z-index: 2; -} - -.container__expandable { - padding: 5px 5px 45px; - - &::after { - background: linear-gradient(0deg, rgb(25, 62, 78) 10%, rgba(0, 0, 0, 0)) !important; - bottom: 40px; - content: ' '; - height: 100%; - left: 0; - max-height: 300px; - opacity: 1; - pointer-events: none; - position: absolute; - width: 100%; - } -} - -.container__expandable.container__expanded::after { - opacity: 0; -} - -.pre { - display: flex; - font-family: var(--mm-font-stack-monospace) !important; - grid-area: code; - height: 100%; - margin: var(--mm-spacing) auto 0 !important; - max-height: 500px; - - overflow-y: hidden !important; - - @include variables.scrollbars(); -} - -.container__expanded .pre { - max-height: 100000px; - transition: max-height 0.5s cubic-bezier(0, 1, 0, 1); -} - -.pre code { - background: transparent; -} - -.expandBtn { - background: rgba(255, 255, 255, 0.1); - border: 0; - border-radius: 0 0 var(--mm-border-radius) var(--mm-border-radius); - border-top: 1px solid rgba(255, 255, 255, 0.15); - bottom: 0; - color: #bbb; - cursor: pointer; - display: inline-block; - height: 40px; - left: 50%; - line-height: 40px; - position: absolute; - transform: translateX(-50%); - width: 100%; -} - -.expandBtn:hover { - background: rgba(255, 255, 255, 0.15); - color: lighten(#b4bbc7, 10); -} - -.container__expanded .expandBtn svg { - transform: rotate(180deg); -} diff --git a/src/components/Mdx/Pre/Code.tsx b/src/components/Mdx/Pre/Code.tsx deleted file mode 100644 index cbf7d64d5..000000000 --- a/src/components/Mdx/Pre/Code.tsx +++ /dev/null @@ -1,173 +0,0 @@ -/* eslint-disable simple-import-sort/imports */ -// Disabling import sort because prismjs needs to be imported before -// the theme and components - -import classNames from 'classnames'; -import Prism from 'prismjs'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaAngleDoubleDown } from 'react-icons/fa'; - -import { ILanguage } from '../../../languages'; -import * as styles from './Code.module.scss'; -import './Code.dark-theme.css'; - -import 'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js'; - -interface ICode { - children: React.ReactNode; - highlightLines?: string; - language: ILanguage; - showLineNumbers?: boolean; -} - -const hasScrollbar = ( - $el: HTMLElement -): boolean => $el.scrollHeight > $el.offsetHeight; - -const Code: React.FC = (props) => { - const { - children, - language, - highlightLines, - showLineNumbers, - } = props; - - const preRef = React.createRef(); - const [ - isExpandable, - setIsExpandable, - ] = React.useState(false); - const [ - isExpanded, - setIsExpanded, - ] = React.useState(false); - - let promises: Promise[] = []; - - if (language.prismSettings.importScript) { - promises = [ - ...promises, - // Needed for PHP - import('prismjs/components/prism-markup-templating.js' as string), - // To add/remove languages, you also have to update languages.ts - import(`prismjs/components/prism-${language.id}.js`), - ]; - } - - if (language.prismSettings.cli) { - promises = [ - ...promises, - import( - 'prismjs/plugins/command-line/prism-command-line.css' as string - ), - import( - 'prismjs/plugins/command-line/prism-command-line.js' as string - ), - ]; - } else { - promises = [ - ...promises, - Promise.all([ - import( - 'prismjs/plugins/line-numbers/prism-line-numbers.css' as string - ), - import( - 'prismjs/plugins/line-numbers/prism-line-numbers.js' as string - ), - ]).then(() => Promise.all([ - import( - 'prismjs/plugins/line-highlight/prism-line-highlight.js' as string - ), - import( - 'prismjs/plugins/line-highlight/prism-line-highlight.css' as string - ), - ])), - ]; - } - - const mmReactCodeMount = new CustomEvent('mm-react-code-mount'); - - React.useEffect(() => { - Promise.race(promises).then(() => { - document.dispatchEvent(mmReactCodeMount); - }); - - Promise.all(promises).then(() => { - const { indentSize, indentStyle } = language.prismSettings.whitespace; - - Prism.plugins.NormalizeWhitespace.setDefaults({ - 'left-trim': true, - 'remove-indent': true, - 'remove-initial-line-feed': true, - 'remove-trailing': true, - 'right-trim': true, - 'spaces-to-tabs': indentStyle === 'tab' ? indentSize : undefined, - 'tabs-to-spaces': indentStyle === 'space' ? indentSize : undefined, - }); - - if(preRef.current) { - Prism.highlightAllUnder(preRef.current as Element); - } - }); - }); - - React.useEffect(() => { - setIsExpandable(hasScrollbar(preRef.current as HTMLElement)); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ - isExpandable, - ]); - - const handleExpansionToggle = (): void => setIsExpanded(!isExpanded); - - return ( -
    -
    -        {children}
    -      
    - {isExpandable && ( - - )} -
    - ); -}; - -Code.defaultProps = { - showLineNumbers: true, -}; - -Code.propTypes = { - children: PropTypes.node.isRequired, - highlightLines: PropTypes.string, - language: PropTypes.any.isRequired, - // eslint-disable-next-line react/boolean-prop-naming - showLineNumbers: PropTypes.bool.isRequired, -}; - -export default Code; diff --git a/src/components/Mdx/Pre/Pre.module.scss b/src/components/Mdx/Pre/Pre.module.scss deleted file mode 100644 index 63577aaf6..000000000 --- a/src/components/Mdx/Pre/Pre.module.scss +++ /dev/null @@ -1,86 +0,0 @@ -@use '../../../styles/variables'; - -.container { - color: #d5ddeb; - display: inline-block; - font-size: 14px; - position: relative; - width: 100%; -} - -.toolbar { - background-color: #3d5c6a; - border-radius: var(--mm-border-radius) var(--mm-border-radius) 0 0; - border-top: 1px solid rgba(255, 255, 255, 0.3); - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - display: grid; - grid-auto-flow: column; - grid-template-columns: 1fr max-content; - height: var(--mm-spacing); - position: sticky; - top: calc(var(--page-header-height) + 15px); - width: 100%; - z-index: 3; -} - -.toolbar::before { - background: #fff; - content: ' '; - display: block; - height: 15px; - position: absolute; - top: -16px; - width: 100%; -} - -.toolbar + [class^='Pre-module--content'] [class^='Code-module--container'] { - border-radius: 0 0 var(--mm-border-radius) var(--mm-border-radius); - border-top: 0; -} - -.copyBtn { - border-radius: 0 !important; - position: relative; -} - -.copyBtn__checkedContent { - display: none; -} - -.copyBtn__checkedContent svg { - fill: #56f000; -} - -.copyBtn__isCopying .copyBtn__content { - visibility: hidden; -} - -.copyBtn__isCopying .copyBtn__checkedContent { - display: inline-block; - left: 50%; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); -} - -@include variables.breakpoint('lg') { - .toolbar__buttons { - display: block; - } -} - -.content { - position: relative; - top: 0; -} - -/* TODO - target class names instead of element */ -.container pre { - margin-top: 0 !important; -} - -.hidden { - max-height: 0; - overflow: hidden; - visibility: hidden; -} diff --git a/src/components/Mdx/Pre/Pre.tsx b/src/components/Mdx/Pre/Pre.tsx deleted file mode 100644 index d36d47d54..000000000 --- a/src/components/Mdx/Pre/Pre.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import classNames from 'classnames'; -import debounce from 'lodash.debounce'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaCheck, FaCopy } from 'react-icons/fa'; - -import useIsClient from '../../../hooks/useIsClient'; -import { ILanguage,languages } from '../../../languages'; -import Button from './Button'; -import Code from './Code'; -import Wrapper from './Wrapper'; - -import * as styles from './Pre.module.scss'; - -interface IPre { - className?: string; - hasWrapper?: boolean; - hidden?: boolean; - highlightLines?: string; - select?: React.ReactElement>; - showLineNumbers?: boolean; - tabs?: React.ReactElement>; -} - -const extractCli = (className: string): string => className && className - .startsWith('language-cli-') ? 'language-markdown' : className; - -const Pre: React.FC & IPre> = (props) => { - const { - children, - className, - hasWrapper, - highlightLines, - select, - showLineNumbers, - tabs, - ...rest - } = props; - - const { isClient, key } = useIsClient(); - - let child = React.Children.toArray(children)[0] as React.ReactElement; - - const extractedClassName = extractCli(child.props.className); - - child = React.cloneElement(child, { - className: extractedClassName, - }); - - const language = languages.find( - language => `language-${language.id}` === extractedClassName - ) || { - id: extractedClassName?.replace('language-', ''), - label: extractedClassName?.replace('language-', ''), - prismSettings: languages.find( - language => language.id === '*' - )?.prismSettings, - } as ILanguage; - - /* ---------- */ - - const [ - isCopying, - setIsCopying, - ] = React.useState(false); - - const handleCopyClick = (): void => { - setIsCopying(true); - - if (navigator.clipboard) { - navigator.clipboard.writeText(child.props.children.trim()) - .then(() => { - setTimeout(() => { - setIsCopying(false); - }, 3000); - }); - } - }; - - /* ---------- */ - - const [ - cachedTabsWidth, - cacheTabsWidth, - ] = React.useState(0); - - const [ - languageUIType, - setLanguageUIType, - ] = React.useState<'select' | 'tabs'>('tabs'); - - const toolbarRef = React.useRef(null); - const tabsRef = React.useRef(null); - - const handleWindowResize = React.useCallback(() => { - const tabsWidth = cachedTabsWidth || tabsRef.current?.offsetWidth || 0; - - if (!cachedTabsWidth && tabsRef.current?.offsetWidth) { - cacheTabsWidth(tabsRef.current.offsetWidth); - } - - if (!toolbarRef.current?.offsetWidth) { - return; - } - - const toolbarWidth = toolbarRef.current.offsetWidth; - - if (toolbarWidth - tabsWidth < 200 ) { - setLanguageUIType('select'); - } else { - setLanguageUIType('tabs'); - } - }, [ - cachedTabsWidth, - ]); - - const debouncedHandleWindowResize = React.useMemo( - () => debounce(handleWindowResize, 300), - [ - handleWindowResize, - ] - ); - - // eslint-disable-next-line react-hooks/exhaustive-deps - React.useLayoutEffect(() => { - if (tabsRef.current?.offsetWidth) { - cacheTabsWidth(tabsRef.current.offsetWidth); - } - - window.addEventListener('resize', debouncedHandleWindowResize); - handleWindowResize(); - - return () => window.removeEventListener( - 'resize', - debouncedHandleWindowResize - ); - }); - - if ( !isClient ) return null; - - const codeExample = ( -
    -
    -
    - {languageUIType === 'tabs' ? ( - - {tabs} - - ) : select} -
    -
    - {Object.prototype.hasOwnProperty.call(navigator, 'clipboard') && ( - - )} -
    -
    -
    - - {child} - -
    -
    - ); - - if (hasWrapper) { - return ( - - {codeExample} - - ); - } - - return codeExample; -}; - - -Pre.propTypes = { - children: PropTypes.node, - className: PropTypes.string, - hasWrapper: PropTypes.bool, - hidden: PropTypes.bool, - highlightLines: PropTypes.string, - select: PropTypes.any, - showLineNumbers: PropTypes.bool, - tabs: PropTypes.any, -}; - -export default Pre; diff --git a/src/components/Mdx/Pre/Wrapper.module.scss b/src/components/Mdx/Pre/Wrapper.module.scss deleted file mode 100644 index d34943961..000000000 --- a/src/components/Mdx/Pre/Wrapper.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use '../../../styles/variables'; - -.wrapper { - align-items: center; - display: flex; - flex-direction: column; - justify-content: center; - padding: var(--mm-spacing) 0 0; -} diff --git a/src/components/Mdx/Pre/Wrapper.tsx b/src/components/Mdx/Pre/Wrapper.tsx deleted file mode 100644 index 0db227793..000000000 --- a/src/components/Mdx/Pre/Wrapper.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Wrapper.module.scss'; - -interface IWrapper { - children?: React.ReactNode; - className?: string; -} - -const Wrapper: React.FC = (props) => { - const { children, className, ...rest } = props; - return ( -
    - {children} -
    - ); -}; - -Wrapper.propTypes = { - children: PropTypes.node, - className: PropTypes.string, -}; - -export default Wrapper; diff --git a/src/components/Mdx/Pre/index.ts b/src/components/Mdx/Pre/index.ts deleted file mode 100644 index 361c4757d..000000000 --- a/src/components/Mdx/Pre/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as default } from './Pre'; diff --git a/src/components/Mdx/Strong.module.scss b/src/components/Mdx/Strong.module.scss deleted file mode 100644 index b69cce902..000000000 --- a/src/components/Mdx/Strong.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.strong { - font-weight: 700; -} diff --git a/src/components/Mdx/Strong.tsx b/src/components/Mdx/Strong.tsx deleted file mode 100644 index e1bb1e267..000000000 --- a/src/components/Mdx/Strong.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Strong.module.scss'; - -const Strong: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Strong.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Strong; diff --git a/src/components/Mdx/Table.module.scss b/src/components/Mdx/Table.module.scss deleted file mode 100644 index 6f32f423a..000000000 --- a/src/components/Mdx/Table.module.scss +++ /dev/null @@ -1,36 +0,0 @@ -@use '../../styles/variables'; - -.wrapper { - align-items: center; - display: flex; - flex-direction: column; - justify-content: center; - padding: var(--mm-spacing) 0; -} - -.container { - background-color: var(--mm-color-sidebar); - border-bottom: 1px solid var(--mm-color-border); - border-left: 1px solid #eee; - border-radius: var(--mm-border-radius); - border-right: 1px solid #eee; - border-top: 1px solid #eee; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - color: #ccc; - display: inline-block; - margin: 0 auto; - max-width: 100%; - overflow-x: scroll; - position: relative; - width: 100%; - z-index: 2; - - @include variables.scrollbars(rgba(0,0,0,0.2)); -} - -.table { - font-size: 1rem; - line-height: 1rem; - overflow-x: auto; - width: 100%; -} diff --git a/src/components/Mdx/Table.tsx b/src/components/Mdx/Table.tsx deleted file mode 100644 index 85e93f235..000000000 --- a/src/components/Mdx/Table.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Table.module.scss'; - -const Table: React.FC> = ({ - className, - ...props -}) => ( -
    -
    - - {props.children} -
    -
    -
    -); - -Table.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Table; diff --git a/src/components/Mdx/Tbody.tsx b/src/components/Mdx/Tbody.tsx deleted file mode 100644 index 8405dcedb..000000000 --- a/src/components/Mdx/Tbody.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; - -const Tbody: React.FC> = ({ ...props }) => ( - - {props.children} - -); - -Tbody.propTypes = { - children: PropTypes.node.isRequired, -}; - -export default Tbody; diff --git a/src/components/Mdx/Td.module.scss b/src/components/Mdx/Td.module.scss deleted file mode 100644 index 484049967..000000000 --- a/src/components/Mdx/Td.module.scss +++ /dev/null @@ -1,34 +0,0 @@ -.td { - border-top: 1px solid #eee; - color: var(--mm-color-primary-text); - font-size: 12px !important; - line-height: 18px !important; - padding: 16px; -} - -.td * { - max-width: initial !important; - min-width: initial !important; - width: auto !important; -} - -.td *:not([class^='Tag-module--']) { - font-size: 12px; - line-height: 2em; - margin: calc(var(--mm-spacing) / 4) 0; - max-width: initial !important; - min-width: initial !important; - width: auto !important; -} - -.td > *:first-child { - margin-top: 0; -} - -.td > *:last-child { - margin-bottom: 0; -} - -.td [class^='Code-module'] { - white-space: nowrap; -} diff --git a/src/components/Mdx/Td.tsx b/src/components/Mdx/Td.tsx deleted file mode 100644 index f12517f44..000000000 --- a/src/components/Mdx/Td.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Td.module.scss'; - -const Td: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Td.propTypes = { - children: PropTypes.node, - className: PropTypes.string, -}; - -export default Td; diff --git a/src/components/Mdx/Th.module.scss b/src/components/Mdx/Th.module.scss deleted file mode 100644 index cf2f14f03..000000000 --- a/src/components/Mdx/Th.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.th { - border-bottom: 1px solid var(--mm-color-border); - color: var(--mm-color-display-text); - font-family: var(--mm-font-stack-display); - font-size: 14px; - font-weight: 700; - padding: 16px; - position: sticky; - text-align: left; - white-space: nowrap; -} diff --git a/src/components/Mdx/Th.tsx b/src/components/Mdx/Th.tsx deleted file mode 100644 index 6dfb5e2e1..000000000 --- a/src/components/Mdx/Th.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { MDXProvider } from '@mdx-js/react'; -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Th.module.scss'; - -const Th: React.FC> = ({ - className, - ...props -}) => ( - - {/* eslint-disable-next-line max-len */ } - {/* @ts-expect-error: @type for @mdx-js/react has implicit children which is incompat with react 18 */} - - {props.children} - - -); - -Th.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Th; diff --git a/src/components/Mdx/Thead.module.scss b/src/components/Mdx/Thead.module.scss deleted file mode 100644 index faa996667..000000000 --- a/src/components/Mdx/Thead.module.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use '../../styles/variables'; - -.thead { - border-bottom: 1px solid var(--mm-color-border); -} diff --git a/src/components/Mdx/Thead.tsx b/src/components/Mdx/Thead.tsx deleted file mode 100644 index c57b3b79f..000000000 --- a/src/components/Mdx/Thead.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Thead.module.scss'; - -const Thead: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Thead.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Thead; diff --git a/src/components/Mdx/Tr.module.scss b/src/components/Mdx/Tr.module.scss deleted file mode 100644 index 68521d0cd..000000000 --- a/src/components/Mdx/Tr.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -thead .tr th { - background: rgba(255, 255, 255, 0.7); -} - -tbody .tr:nth-of-type(even) td { - background: rgba(255, 255, 255, 0.7); -} diff --git a/src/components/Mdx/Tr.tsx b/src/components/Mdx/Tr.tsx deleted file mode 100644 index 6f0cb36e9..000000000 --- a/src/components/Mdx/Tr.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Tr.module.scss'; - -const Tr: React.FC> = ({ - className, - ...props -}) => ( - - {props.children} - -); - -Tr.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Tr; diff --git a/src/components/Mdx/Ul.module.scss b/src/components/Mdx/Ul.module.scss deleted file mode 100644 index eb35111f1..000000000 --- a/src/components/Mdx/Ul.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -@use '../../styles/variables'; - -.ul { - list-style-type: disc; - margin: var(--mm-spacing) 0 var(--mm-spacing) calc(var(--mm-spacing) / 2); - padding-left: calc(var(--mm-spacing) / 2); -} - -.ul .ul { - margin: calc(var(--mm-spacing) / 4) 0; -} diff --git a/src/components/Mdx/Ul.tsx b/src/components/Mdx/Ul.tsx deleted file mode 100644 index 9c2508017..000000000 --- a/src/components/Mdx/Ul.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import * as styles from './Ul.module.scss'; - -const Ul: React.FC> = ({ - className, - ...props -}) => ( -
      - {props.children} -
    -); - -Ul.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Ul; diff --git a/src/components/Mdx/index.ts b/src/components/Mdx/index.ts deleted file mode 100644 index cf2ac3f9c..000000000 --- a/src/components/Mdx/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Any component exported here will be made available for use in MDX files -// eslint-disable-next-line max-len -// Reference: https://github.com/mdx-js/mdx/blob/master/docs/getting-started/_table-of-components.mdx -export { Link } from 'gatsby'; - -export { default as Alert } from '../Alert'; -export { default as CodeSet } from '../CodeSet'; -export { default as Example } from '../Example'; -export { default as GeoIPCrontab } from '../GeoIPCrontab'; -export { default as IpAddresses } from '../IpAddresses'; -export * from '../LinkGroup'; -export * from '../Schema'; -export { default as ReleaseNote } from '../ReleaseNote'; - -export { default as a } from './A'; -export { default as blockquote } from './Blockquote'; -export { default as CsvBlockTable } from '../CsvBlockTable'; -export { default as CsvLocationTable } from '../CsvLocationTable'; -export { default as inlineCode } from './Code'; -export { default as del } from './Del'; -export { default as em } from './Em'; -export { default as h1 } from './H1'; -export { default as h2 } from './H2'; -export { default as h3 } from './H3'; -export { default as h4 } from './H4'; -export { default as h5 } from './H5'; -export { default as h6 } from './H6'; -export { default as hr } from './Hr'; -export { default as img } from './Img'; -export { default as li } from './Li'; -export { default as ol } from './Ol'; -export { default as p } from './P'; -export { default as pre } from './Pre'; -export { default as strong } from './Strong'; -export { default as table } from './Table'; -export { default as tbody } from './Tbody'; -export { default as td } from './Td'; -export { default as th } from './Th'; -export { default as tr } from './Tr'; -export { default as thead } from './Thead'; -export { default as ul } from './Ul'; -export { default as CsvFileExamples } from '../CsvExampleFiles'; -export { default as DatabaseChanges } from '../DatabaseChanges'; -export { default as DatabaseSizes } from '../DatabaseSizes'; -export { default as MmdbFileExamples } from '../MmdbExampleFiles'; -export { default as ZipFileContent } from '../ZipFileContent'; diff --git a/src/components/MmdbExampleFiles.tsx b/src/components/MmdbExampleFiles.tsx deleted file mode 100644 index 4a232a629..000000000 --- a/src/components/MmdbExampleFiles.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { a as A, li as Li, p as P, ul as Ul } from './Mdx'; - -interface IExampleFiles { - files: { - filename: string; - link: string; - }[] -} - -const MmdbExampleFiles: React.FC = (props) => { - const { files } = props; - const fileItems = files.map((file) => ( -
  • - - {file.filename} - -
  • - )); - - return ( - <> -

    We maintain test MMDB files on GitHub:

    - -

    -

      - {fileItems} -
    -

    - -

    - Alternatively, you can - {' '} - - view all of our MMDB test data on GitHub - - . -

    - - ); -}; - -MmdbExampleFiles.propTypes = { - files: PropTypes.array.isRequired, -}; - -export default MmdbExampleFiles; diff --git a/src/components/ProductIcon.module.scss b/src/components/ProductIcon.module.scss deleted file mode 100644 index a0d79bdb4..000000000 --- a/src/components/ProductIcon.module.scss +++ /dev/null @@ -1,52 +0,0 @@ -.container { - --mm-product-icon-stroke-width: 6px; - background: linear-gradient(var(--page-type-color), rgba(0, 119, 194, 1)); - border-radius: calc(var(--mm-border-radius) * 3); - box-shadow: var(--mm-overview-heading-drop-shadow), - inset 0 0 0 var(--mm-product-icon-stroke-width) rgba(255, 255, 255, 0.35); - display: grid; - height: 100px; - width: 100px; -} - -@supports (transform-style: preserve-3d) { - .container { - position: relative; - transform-style: preserve-3d; - z-index: 1; - - &::before { - background: #00a7e5; - border-radius: calc(var(--mm-border-radius) * 3); - content: ' '; - display: block; - height: 100%; - position: absolute; - transform: translateZ(-1px); - width: 100%; - } - } -} - -.icon { - align-self: center; - fill: #fff; - filter: drop-shadow(1px 2px 5px rgba(0, 119, 194, 1)); - height: 100%; - justify-self: center; - max-height: 70%; - max-width: 70%; - width: 100%; -} - -.geoip { - --page-type-color: rgba(0, 255, 102, 0.5); -} - -.geolite { - --page-type-color: rgba(255, 255, 0, 0.5); -} - -.minfraud { - --page-type-color: rgba(255, 0, 136, 0.5); -} diff --git a/src/components/ProductIcon.tsx b/src/components/ProductIcon.tsx deleted file mode 100644 index 32b9f4160..000000000 --- a/src/components/ProductIcon.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; -import { IconType } from 'react-icons'; - -import { Icons } from '../assets'; - -import * as styles from './ProductIcon.module.scss'; - -type SvgElement = React.FC> - -type Icon = SvgElement | string | IconType; - -interface IProductIcon { - className?: string; - family?: 'geoip' | 'geolite' | 'minfraud', - svg: Icon; -} - -export const isSvgString = ( - svg: Icon -): svg is string => typeof svg === 'string' - || (svg as unknown) instanceof String; - -const ProductIcon: React.FC< - React.HTMLProps & IProductIcon -> = (props) => { - const svg = props.svg; - - // eslint-disable-next-line security/detect-object-injection - const Icon = isSvgString(svg) ? Icons[svg] : svg; - - return ( -
    - -
    - ); -}; - -ProductIcon.propTypes = { - className: PropTypes.string, - family: PropTypes.oneOf([ - 'geoip', - 'geolite', - 'minfraud', - ] as const), - svg: PropTypes.oneOfType([ - PropTypes.func.isRequired, - PropTypes.string.isRequired, - ]).isRequired, -}; - -export default ProductIcon; diff --git a/src/components/ReleaseNote.module.scss b/src/components/ReleaseNote.module.scss deleted file mode 100644 index f47cde742..000000000 --- a/src/components/ReleaseNote.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use '../styles/variables'; - -.article { - margin-bottom: calc(var(--mm-spacing) * 2); -} - -.title { - margin-bottom: calc(var(--mm-spacing) / 4); - margin-top: 0; -} - -.date { - display: block; - font-size: 16px; - font-style: italic; -} diff --git a/src/components/ReleaseNote.spec.tsx b/src/components/ReleaseNote.spec.tsx deleted file mode 100644 index a2c83ccd5..000000000 --- a/src/components/ReleaseNote.spec.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import H2 from './Mdx/H2'; -import ReleaseNote from './ReleaseNote'; - -// eslint-disable-next-line css-modules/no-unused-class -import * as styles from './ReleaseNote.module.scss'; - -describe('ReleaseNote', () => { - const component = mount( - -

    Hello world

    -
    - ); - - it('renders children', () => { - expect(component.find('p')).toHaveText('Hello world'); - }); - - it('renders humanized date', () => { - expect(component.find(`.${styles.date}`)).toHaveText('October 23, 2021'); - }); - - it('renders title with slugified id', () => { - const $title = component.find(H2); - - expect($title).toHaveText('Test Title'); - expect($title.prop('id')).toBe('test-title'); - }); - - it('throws an error if date prop is in wrong format', () => { - // silence prop type console error - console.error = jest.fn(); - - const badDate = () => { - mount( - -

    Hello world

    -
    - ); - }; - - expect(badDate).toThrow(); - }); -}); diff --git a/src/components/ReleaseNote.tsx b/src/components/ReleaseNote.tsx deleted file mode 100644 index 4d87523b0..000000000 --- a/src/components/ReleaseNote.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import GithubSlugger from 'github-slugger'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import H2 from './Mdx/H2'; - -import * as styles from './ReleaseNote.module.scss'; - -type Year = `${number}${number}${number}${number}`; -type Month = '01' | '02' | '03' | '04' | '05' | '06' | '07' | '08' | '09' | '10' - | '11' | '12'; -type Day = '01' | '02'| '03'| '04' | '05' | '06' | '07' | '08' | '09' | '10' - | '11' | '12' | '13' | '14' | '15' | '16' | '17' | '18' | '19' | '20' | '21' - | '22' | '23' | '24' | '25' | '26' | '27' | '28' | '29' | '30' | '31'; - -interface IReleaseNote { - children: React.ReactNode; - date: `${Year}-${Month}-${Day}`; - title: string; -} - -const dateOptions = { - day: 'numeric', - month: 'long', - timeZone: 'America/New_York', - year: 'numeric', -}; - -const ReleaseNote: React.FC = (props) => { - // Assume publish time is around noon office standard time - const date = new Date(`${props.date} 12:00:00`); - //@ts-expect-error: Types are broken for DateTimeFormat - const humanDate = new Intl.DateTimeFormat('en-US', dateOptions).format(date); - - return ( -
    -

    - {props.title} -

    - - {humanDate} - - {props.children} -
    - ); -}; - -ReleaseNote.propTypes = { - children: PropTypes.node.isRequired, - date: function(props, propName, componentName) { - if ( - !/^[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/.test( - // eslint-disable-next-line security/detect-object-injection - props[propName] - ) - ) - { - return new Error( - // eslint-disable-next-line security/detect-object-injection - `Invalid date \`${props[propName]}\` supplied to ${componentName}.` - ); - } - return null; - }, - title: PropTypes.string.isRequired, -}; - -export default ReleaseNote; diff --git a/src/components/Schema/Footnote.module.scss b/src/components/Schema/Footnote.module.scss deleted file mode 100644 index 7d50ece40..000000000 --- a/src/components/Schema/Footnote.module.scss +++ /dev/null @@ -1,29 +0,0 @@ -.container { - background: var(--mm-color-sidebar); - border-radius: 0 var(--mm-border-radius) var(--mm-border-radius) 0; - border-top: 1px solid var(--mm-color-border); - padding: calc(var(--mm-spacing) / 2); -} - -.container * { - color: #545454 !important; - font-size: 12px !important; - font-style: italic; - font-weight: 500; - line-height: 22px !important; - max-width: initial !important; - min-width: initial !important; - width: auto !important; -} - -.container > * { - margin: calc(var(--mm-spacing) / 4) 0; -} - -.container > *:first-child { - margin-top: 0; -} - -.container > *:last-child { - margin-bottom: 0; -} diff --git a/src/components/Schema/Footnote.spec.tsx b/src/components/Schema/Footnote.spec.tsx deleted file mode 100644 index f5352edd4..000000000 --- a/src/components/Schema/Footnote.spec.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import Footnote from './Footnote'; - -describe('', () => { - it('renders children', () => { - const text = 'foo'; - const component = mount( - - {text} - - ); - - expect(component.text()).toBe(text); - }); -}); diff --git a/src/components/Schema/Footnote.tsx b/src/components/Schema/Footnote.tsx deleted file mode 100644 index 22dd4ced6..000000000 --- a/src/components/Schema/Footnote.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import * as styles from './Footnote.module.scss'; - -const Footnote: React.FC = (props) => { - const { children } = props; - - return ( -
    - {children} -
    - ); -}; - -Footnote.propTypes = { - children: PropTypes.node.isRequired, -}; - -export default Footnote; diff --git a/src/components/Schema/GeoIpSchema.spec.tsx b/src/components/Schema/GeoIpSchema.spec.tsx deleted file mode 100644 index b015ed65c..000000000 --- a/src/components/Schema/GeoIpSchema.spec.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import GeoIpSchema from './GeoIpSchema'; - -describe('', () => { - it('passes props to schema component', () => { - const props = { - children: ( -

    Foo

    - ), - json:{ - foo: 'foo', - }, - jsonPointer: '/', - name: 'Foo', - services: '*' as GeoIpServices, - }; - const component = mount( - - ); - - const schemaComponent = component.find('Schema'); - - expect(schemaComponent.props()).toStrictEqual({ - ...props, - productFamily: 'geoip', - }); - }); -}); diff --git a/src/components/Schema/GeoIpSchema.tsx b/src/components/Schema/GeoIpSchema.tsx deleted file mode 100644 index 40b037940..000000000 --- a/src/components/Schema/GeoIpSchema.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import Schema, { ISchema, schemaPropTypes } from './Schema'; - -interface IGeoIpSchema extends Omit{ - services?: GeoIpServices; -} - -const GeoIpSchema: React.FC = (props) => { - return ( - - ); -}; - -GeoIpSchema.propTypes = { - ...schemaPropTypes, - services: PropTypes.oneOfType([ - PropTypes.oneOf([ - '*', - ] as const), - PropTypes.arrayOf( - PropTypes.oneOf([ - 'country', - 'city', - 'insights', - ] as const).isRequired, - ), - ]), -}; - -export default GeoIpSchema; diff --git a/src/components/Schema/GeoIpServiceTags.spec.tsx b/src/components/Schema/GeoIpServiceTags.spec.tsx deleted file mode 100644 index 290c1b98f..000000000 --- a/src/components/Schema/GeoIpServiceTags.spec.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import GeoIpServiceTags from './GeoIpServiceTags'; - -// eslint-disable-next-line css-modules/no-unused-class -import * as styles from './ServiceTag.module.scss'; - -describe('', () => { - it('renders all service tags', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Country"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="City"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).not.toHaveClassName(styles['tag__disabled']); - }); - - it('renders `country` service tag', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Country"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="City"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).toHaveClassName(styles['tag__disabled']); - }); - - it('renders `city` service tag', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Country"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="City"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).toHaveClassName(styles['tag__disabled']); - }); - - it('renders `insights` service tag', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Country"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="City"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).not.toHaveClassName(styles['tag__disabled']); - }); -}); diff --git a/src/components/Schema/GeoIpServiceTags.tsx b/src/components/Schema/GeoIpServiceTags.tsx deleted file mode 100644 index ce3db4372..000000000 --- a/src/components/Schema/GeoIpServiceTags.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import ServiceTag from './ServiceTag'; - -interface IServiceTags { - services: GeoIpServices; -} - -const GeoIpServiceTags: React.FC = (props) => { - const { services } = props; - - return ( -
    - - - - - -
    - ); -}; - -GeoIpServiceTags.propTypes = { - services: PropTypes.any.isRequired, -}; - -export default GeoIpServiceTags; diff --git a/src/components/Schema/MinFraudSchema.spec.tsx b/src/components/Schema/MinFraudSchema.spec.tsx deleted file mode 100644 index 4c9bcc60f..000000000 --- a/src/components/Schema/MinFraudSchema.spec.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import MinFraudSchema from './MinFraudSchema'; - -describe('', () => { - it('passes props to schema component', () => { - const props = { - children: ( -

    Foo

    - ), - json:{ - foo: 'foo', - }, - jsonPointer: '/', - name: 'Foo', - services: '*' as MinFraudServices, - }; - - const component = mount( - - ); - - const schemaComponent = component.find('Schema'); - - expect(schemaComponent.props()).toStrictEqual({ - ...props, - productFamily: 'minfraud', - }); - }); -}); diff --git a/src/components/Schema/MinFraudSchema.tsx b/src/components/Schema/MinFraudSchema.tsx deleted file mode 100644 index 6c547e8a4..000000000 --- a/src/components/Schema/MinFraudSchema.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import Schema, { ISchema, schemaPropTypes } from './Schema'; - -interface IMinFraudSchema extends Omit { - services?: MinFraudServices; -} - -const MinFraudSchema: React.FC = (props) => { - - return ( - - ); -}; - -MinFraudSchema.propTypes = { - ...schemaPropTypes, - services: PropTypes.oneOfType([ - PropTypes.oneOf([ - '*', - ] as const), - PropTypes.arrayOf( - PropTypes.oneOf([ - 'score', - 'insights', - 'factors', - ] as const).isRequired, - ), - ]), -}; - -export default MinFraudSchema; diff --git a/src/components/Schema/MinFraudServiceTags.spec.tsx b/src/components/Schema/MinFraudServiceTags.spec.tsx deleted file mode 100644 index 9e5b1f94e..000000000 --- a/src/components/Schema/MinFraudServiceTags.spec.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import MinFraudServiceTags from './MinFraudServiceTags'; - -// eslint-disable-next-line css-modules/no-unused-class -import * as styles from './ServiceTag.module.scss'; - -describe('', () => { - it('renders all service tags', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Score"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Factors"]') - ).not.toHaveClassName(styles['tag__disabled']); - }); - - it('renders `score` service tag', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Score"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Factors"]') - ).toHaveClassName(styles['tag__disabled']); - }); - - it('renders `insights` service tag', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Score"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).not.toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Factors"]') - ).toHaveClassName(styles['tag__disabled']); - }); - - it('renders `factors` service tag', () => { - const component = mount( - - ); - - expect( - component.find('Tag[children="Score"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Insights"]') - ).toHaveClassName(styles['tag__disabled']); - - expect( - component.find('Tag[children="Factors"]') - ).not.toHaveClassName(styles['tag__disabled']); - }); -}); diff --git a/src/components/Schema/MinFraudServiceTags.tsx b/src/components/Schema/MinFraudServiceTags.tsx deleted file mode 100644 index 65e458c44..000000000 --- a/src/components/Schema/MinFraudServiceTags.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import ServiceTag from './ServiceTag'; - -interface IServiceTags { - className?: string; - services: MinFraudServices; -} - -const MinFraudServiceTags: React.FC = (props) => { - const { className, services } = props; - - return ( -
    - - - - - -
    - ); -}; - -MinFraudServiceTags.propTypes = { - className: PropTypes.string, - services: PropTypes.any.isRequired, -}; - -export default MinFraudServiceTags; diff --git a/src/components/Schema/Property.module.scss b/src/components/Schema/Property.module.scss deleted file mode 100644 index ae0e1e64f..000000000 --- a/src/components/Schema/Property.module.scss +++ /dev/null @@ -1,166 +0,0 @@ -@use '../../styles/variables'; - -.row { - border: 2px solid transparent; - padding: calc(var(--mm-spacing) / 2); - position: relative; - scroll-margin-top: calc(var(--page-header-height) + var(--mm-spacing) + 46px); -} - -.row::before { - background: var(--mm-color-border); - content: ' '; - height: 1px; - left: calc(var(--mm-spacing) / 2); - position: absolute; - top: -3px; - width: calc(100% - var(--mm-spacing)); -} - -:not(.row) + .row::before { - border-top: 1px solid var(--mm-color-border); - height: 0; - left: -2px; - width: calc(100% + 4px); -} - -.row:last-of-type { - border-radius: 0 0 var(--mm-border-radius) var(--mm-border-radius); -} - -.row:last-of-type::after { - display: none; -} - -.row__targeted { - background: #effbff; - border: var(--mm-outline); - z-index: 2; -} - -.row__targeted::after { - display: none; -} - -.name { - border-bottom: 2px dotted var(--mm-color-primary-text); - color: var(--mm-color-primary-text); - font-family: var(--mm-font-stack-monospace); - font-size: 14px; - font-weight: 500; - line-height: 26px; - text-decoration: none; -} - -.type { - margin-left: calc(var(--mm-spacing) / 4); - vertical-align: middle; -} - -.deprecated { - background: #ffefee; - border-color: #ffd8d6; - color: #8c362e; - margin-left: calc(var(--mm-spacing) / 4); - vertical-align: middle; -} - -.row__targeted .type { - background: #fff; -} - -.description { - color: var(--mm-color-primary-text); - font-size: 14px; - line-height: 21px; - margin: calc(var(--mm-spacing) / 2) 0; -} - -.description [class^='P-module'] { - font-size: 14px; - margin-left: 0; - margin-right: 0; -} - -.description [class^='Table-module--wrapper'] { - padding: calc(var(--mm-spacing) / 2) 0; -} - -.description [class^='Th-module'], -.description [class^='Table-module--table'] [class^='P-module'], -.description [class^='Table-module--table'] [class^='Code-module'] { - font-size: 12px; - line-height: 20px; -} - -.description [class^='Th-module'], -.description [class^='Td-module'] { - padding: 8px; -} - -.description > [class^='Ul-module'] { - margin-left: 0; - margin-right: 0; - max-width: calc(100vw - calc(var(--mm-spacing) * 3 + 6px)); - overflow-x: scroll; - padding-left: calc(var(--mm-spacing) / 2) !important; -} - -.description > * { - max-width: auto !important; - min-width: auto !important; -} - -.description > *:first-child { - margin-top: 0 !important; -} - -.description > *:last-child { - margin-bottom: 0 !important; -} - - -.row__targeted .example-value { - background: var(--mm-color-background); -} - -.schemaLink__tag { - margin: 0 calc(var(--mm-spacing) / 4) calc(var(--mm-spacing) / 4) 0; -} - -.schemaLink__tag:hover { - background: #fff; -} - -.schemaLink__tag::after { - content: '→'; - margin-left: 4px; -} - -.tags__schemaTag { - background: #fffaf1; - border-color: #ffe5bb; - color: #764b13; - margin: 0 calc(var(--mm-spacing) / 4) calc(var(--mm-spacing) / 4) 0; -} - -.tags__schemaTagValue { - font-weight: 500; -} - -.tags__schemaTag:last-of-type { - margin-right: 0; -} - -.row__targeted .tags__schemaTag { - background: var(--mm-color-background); -} - -@include variables.breakpoint('sm') { - .tags { - display: grid; - gap: var(--mm-spacing); - grid-template-columns: 1fr max-content; - grid-template-rows: auto; - } -} diff --git a/src/components/Schema/Property.spec.tsx b/src/components/Schema/Property.spec.tsx deleted file mode 100644 index 2f6a19d68..000000000 --- a/src/components/Schema/Property.spec.tsx +++ /dev/null @@ -1,408 +0,0 @@ -import { ReactWrapper } from 'enzyme'; -import * as React from 'react'; - -import Link from '../Link'; -import { p as P } from '../Mdx'; -import Property from './Property'; -import Schema from './Schema'; -import SchemaContext from './SchemaContext'; - -import * as styles from './Property.module.scss'; - -const json = { - arr: [ - 'foo', - 'bar', - ], - boolean: true, - null: null, - number: 42, - obj: { - bar: 'bar', - foo: 'foo', - }, - string: 'string', -}; - -const withContext = (element: React.ReactElement) => global.mountWithRouter( - - {element} - -); - -describe('', () => { - it('can be marked as deprecated', () => { - const component1 = withContext( - - ); - - expect(component1.find(`.${styles.deprecated}`)).not.toExist(); - - const component2 = withContext( - - ); - - expect(component2.find(`.${styles.deprecated}`).first()).toExist(); - }); - - describe('is linkable', () => { - const name = 'bar'; - const schemaId = 'foo'; - const propertyId = `schema--${schemaId}__${name}`; - let component: ReactWrapper; - - beforeAll(() => { - component = global.mountWithRouter( - - - - ); - }); - - it('adds correct `id` to property container', () => { - expect( - component.find(`[id="${propertyId}"]`) - ).toExist(); - }); - - it('has a component', () => { - expect(component.find(Link)).toExist(); - }); - - describe(' component', () => { - let link: any; - - beforeAll(() => { - link = component.find('Property').find(Link); - }); - - it('has correct `to` value', () => { - expect(link.props().to).toBe(`#${propertyId}`); - }); - - it('has correct text value', () => { - expect(link.text()).toBe(name); - }); - }); - }); - - describe('a type', () => { - it('is inferred if no type property is defined', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.type}`).first().text()).toBe('string'); - }); - - it('can be defined on the `Property` component', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.type}`).first().text()).toBe('object'); - }); - }); - - describe('a description', () => { - it('is not shown if component has no children', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.description}`)).not.toExist(); - }); - - it('is shown if component has children', () => { - const component = withContext( - -

    This is a property!

    -
    - ); - - expect(component.find(`.${styles.description}`)).toExist(); - }); - }); - - describe('an example', () => { - it('is not shown if schema json is not an object', () => { - const component = global.mountWithRouter( - - - - ); - - expect(component.find('Example')).not.toExist(); - }); - - it('is not shown if property name does not exist in schema json', () => { - const component = withContext( - - ); - - expect(component.find('Example')).not.toExist(); - }); - - it('is not shown if property name has null value', () => { - const component = withContext( - - ); - - expect(component.find('Example')).not.toExist(); - }); - - it('contains stringified json for object properties', () => { - const component = withContext( - - ); - - const exampleValue = component.find('Example').first().text(); - expect(exampleValue).toContain(JSON.stringify(json.obj, null, 2)); - }); - - it('contains stringified json for array properties', () => { - const component = withContext( - - ); - - const exampleValue = component.find('Example').first().text(); - expect(exampleValue).toContain(JSON.stringify(json.arr, null, 2)); - }); - - it('contains quotes around for string properties', () => { - const component = withContext( - - ); - - const exampleValue = component.find('Example').first().text(); - expect(exampleValue).toEqual(expect.stringMatching(/\s+"string"/)); - }); - - it('stringifies boolean values', () => { - const component = withContext( - - ); - - const exampleValue = component.find('Example').first().text(); - const regex = new RegExp(/\s+true/); - - expect(regex.test(exampleValue)).toBe(true); - }); - - it('does not format numbers', () => { - const component = withContext( - - ); - - const exampleValue = component.find('Example').first().text(); - const regex = new RegExp(/\s+42/); - - expect(regex.test(exampleValue)).toBe(true); - }); - }); - - describe('tags section', () => { - describe('is not shown if', () => { - it( - '`linkToSchemaName`, `services`, and `tags` props are undefined', - () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.tags}`)).not.toExist(); - } - ); - - it('`isDeprecated` prop is true', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.tags}`)).not.toExist(); - }); - }); - - describe('is shown if', () => { - it('`linkToSchemaName` is defined', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.tags}`)).toExist(); - }); - - it('`services` is defined', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.tags}`)).toExist(); - }); - - it('`tags` is defined', () => { - const component = withContext( - - ); - - expect(component.find(`.${styles.tags}`)).toExist(); - }); - }); - - describe('lists service tags', () => { - it('for `geoip` product family', () => { - const component = global.mountWithRouter( - - - - ); - - expect(component.find('GeoIpServiceTags')).toExist(); - }); - - it('for `minfraud` product family', () => { - const component = global.mountWithRouter( - - - - ); - - expect(component.find('MinFraudServiceTags')).toExist(); - }); - }); - - describe('schema tags', () => { - let schemaTags: ReactWrapper; - - beforeAll(() => { - const component = withContext( - - ); - - schemaTags = component.find('Tag') - .filter(`.${styles['tags__schemaTag']}`); - }); - - it('are listed', () => { - expect(schemaTags.length).toBe(3); - }); - - it('text is key / value pairs', () => { - expect(schemaTags.at(0).text()).toBe('bar: bar'); - expect(schemaTags.at(2).text()).toBe('foo: foo'); - }); - - it('keys without values only show key', () => { - expect(schemaTags.at(1).text()).toBe('baz'); - }); - }); - }); -}); diff --git a/src/components/Schema/Property.tsx b/src/components/Schema/Property.tsx deleted file mode 100644 index 4a496538e..000000000 --- a/src/components/Schema/Property.tsx +++ /dev/null @@ -1,228 +0,0 @@ -import { useLocation } from '@reach/router'; -import CustomPropTypes from 'airbnb-prop-types'; -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import Example from '../Example'; -import Link from '../Link'; -import GeoIpServiceTags from './GeoIpServiceTags'; -import MinFraudServiceTags from './MinFraudServiceTags'; -import PropertyValues from './PropertyValues'; -import SchemaContext from './SchemaContext'; -import Tag from './Tag'; - -import * as styles from './Property.module.scss'; - -type TagValue = boolean | string | number | null; - -export interface IProperty { - children?: React.ReactElement | React.ReactElement[], - isDeprecated?: boolean; - linkToSchemaName?: string; - name: string; - schemaId?: string; - services?: GeoIpServices | MinFraudServices; - tags?: Record; - type?: SchemaPropertyType; -} - -const Property: React.FC = (props) => { - const { - children: description, - isDeprecated, - linkToSchemaName, - tags: schemaTags, - name, - services, - } = props; - const location = useLocation(); - - const schema = React.useContext(SchemaContext); - - const { - example, - linkToSchemaId, - id: propertyId, - type, - } = new PropertyValues({ - property: { - linkToSchemaName, - name, - type: props.type, - }, - schema, - }); - - const serviceTags = services || schema.services; - - return ( -
    - - {name} - - - {type && ( - - {type} - - )} - - {isDeprecated && ( - - deprecated - - )} - - {description && ( -
    - {description} -
    - )} - - {example && ( - - <> - {example.language === 'json' ? '//' : '#'} - {` JSON Pointer: ${example.jsonPointer}\n`} - {example.value} - - - )} - - {(linkToSchemaId || schemaTags || serviceTags) && !isDeprecated && ( -
    -
    - {linkToSchemaId && ( - - - View object schema - - - )} - - {schemaTags && Object.entries(schemaTags).map( - ( - [ - name, - value, - ] : [ - string, - TagValue, - ], - index: number - ) => ( - - - {name} - {typeof value !== 'undefined' && value !== null && ( - <> - : - {' '} - - {value} - - - )} - - ))} -
    - - {serviceTags && schema.productFamily === 'geoip' && ( - - )} - - {serviceTags && schema.productFamily === 'minfraud' && ( - - )} -
    - )} -
    - ); -}; - -Property.propTypes = { - children: PropTypes.oneOfType([ - PropTypes.element, - PropTypes.arrayOf(PropTypes.element.isRequired), - ]), - isDeprecated: PropTypes.bool, - linkToSchemaName: PropTypes.string, - name: PropTypes.string.isRequired, - services: PropTypes.oneOfType([ - PropTypes.oneOf([ - '*', - ] as const), - PropTypes.arrayOf( - PropTypes.oneOf([ - 'score', - 'factors', - 'insights', - ] as const).isRequired, - ), - PropTypes.arrayOf( - PropTypes.oneOf([ - 'country', - 'city', - 'insights', - ] as const).isRequired, - ), - ]), - tags: PropTypes.objectOf( - CustomPropTypes.or([ - PropTypes.bool, - PropTypes.number, - PropTypes.string, - CustomPropTypes.explicitNull(), - ]).isRequired - ), - type: PropTypes.oneOf([ - 'array', - 'array', - 'array', - 'array', - 'array', - 'boolean', - 'number', - 'integer', - 'object', - 'string', - ] as const), -}; - -export default Property; diff --git a/src/components/Schema/PropertyValues.ts b/src/components/Schema/PropertyValues.ts deleted file mode 100644 index 439f39a3b..000000000 --- a/src/components/Schema/PropertyValues.ts +++ /dev/null @@ -1,95 +0,0 @@ -import GithubSlugger from 'github-slugger'; - -import { - inferType, - isArray, - isBoolean, - isObject, - isString, -} from '../../utils/json'; -import { formatSchemaName } from '../../utils/openapi'; -import { IProperty } from './Property'; -import { SchemaContextProps } from './SchemaContext'; - -const slug = GithubSlugger.slug; - -class PropertyValues { - public example?: { - jsonPointer: string; - language: 'bash' | 'json'; - value: string; - }; - public id?: string; - public linkToSchemaId?: string; - public type?: string; - - constructor({ - schema, - property, - }: { - property: Pick; - schema: Pick - }) { - this.type = property.type; - - this.id = `${schema.id}__${slug(property.name)}`; - - this.linkToSchemaId = property.linkToSchemaName && - slug(formatSchemaName(property.linkToSchemaName)); - - if (!isObject(schema.json)) { - return; - } - - // eslint-disable-next-line security/detect-object-injection - const example = schema.json[property.name]; - - if (typeof example === 'undefined' || example === null) { - return; - } - - if (!this.type) { - this.type = inferType(example); - } - - this.example = { - jsonPointer: this.formatPointer(schema.jsonPointer, property.name), - language: this.getLanguage(this.type), - value: this.formatExample(example), - }; - } - - private formatPointer(base: string, property: string) { - return base === '/' - ? `${base}${property}` - : `${base}/${property}`; - } - - private formatExample(example: NonNullable) { - if (isArray(example) || isObject(example)) { - return JSON.stringify( - example, - null, - 2 - ); - } - - if (isString(example)) { - return `"${example}"`; - } - - if (isBoolean(example)) { - return example.toString(); - } - - return example.toString(); - } - - private getLanguage (type: string) { - return type === 'object' || type.startsWith('array') - ? 'json' as const - : 'bash' as const; - } -} - -export default PropertyValues; diff --git a/src/components/Schema/Schema.module.scss b/src/components/Schema/Schema.module.scss deleted file mode 100644 index 3249d616e..000000000 --- a/src/components/Schema/Schema.module.scss +++ /dev/null @@ -1,140 +0,0 @@ -@use '../../styles/variables'; - -.container { - margin: var(--mm-spacing) 0 calc(var(--mm-spacing) + 1px); - position: relative; - scroll-margin-top: calc(var(--page-header-height) + var(--mm-spacing)); - width: 100%; - - [class^='Pre-module--toolbar'] { - top: calc(var(--page-header-height) + 102px); - } -} - -.heading { - background: linear-gradient(#fff, var(--mm-color-sidebar)); - border: 1px solid var(--mm-color-border); - border-radius: var(--mm-border-radius) var(--mm-border-radius) 0 0; - box-shadow: 0 -4px 0 0 var(--mm-color-background); - display: grid; - gap: calc(var(--mm-spacing) / 4); - grid-template-areas: 'name type'; - grid-template-columns: max-content 1fr; - grid-template-rows: max-content; - padding: calc(var(--mm-spacing) / 4) calc(var(--mm-spacing) / 2); - position: sticky; - top: calc(var(--page-header-height) + var(--mm-spacing)); - transform-style: preserve-3d; - z-index: 5; - - &::before { - background: var(--mm-color-background); - content: ' '; - display: block; - height: calc(var(--mm-spacing) + 1px); - left: -1px; - position: absolute; - top: -1px; - transform: translateY(-100%); - width: calc(100% + 2px); - } -} - -/* For IE11 support, align items via the children, not the `.heading` parent */ -.heading > * { - align-self: center; -} - -.heading -.heading__name { - font-weight: 700; - grid-area: name; -} - -.heading__link { - color: var(--mm-color-primary-text); - display: inline-block; - font-size: 12px; - position: relative; - text-decoration: none; -} - -.heading__linkIcon { - font-size: 14px; - left: 0; - opacity: 0.5; - padding-right: 5px; - position: absolute; - top: 50%; - transform: translate(-100%, -50%); -} - -.heading__link:hover .heading__linkIcon { - opacity: 1; -} - -.heading__type { - grid-area: type; -} - -.content { - border: 1px solid var(--mm-color-border); - border-radius: 0 0 var(--mm-border-radius) var(--mm-border-radius); - border-top: 1px solid transparent; - - > :not([class^='Property-module']) { - margin: calc(var(--mm-spacing) / 2) 0; - padding: 0 calc(var(--mm-spacing) / 2); - } - - > :not([class^='Property-module']), - [class^='Li-module'], - [class^='Code-module'] { - font-size: 14px; - line-height: 26px; - } - - [class^='Ol-module'], - [class^='Ul-module'] { - padding-left: var(--mm-spacing); - } - - > [class^='Footnote-module'] { - margin: 0; - padding: calc(var(--mm-spacing) / 2) calc(var(--mm-spacing) / 2); - } - - > [class^='Alert-module'] { - margin-left: var(--mm-spacing); - margin-right: var(--mm-spacing); - } - - [class^='Example-module--value'] { - max-width: calc(100vw - calc(var(--mm-spacing) * 3 + 6px)); - } -} - -@include variables.breakpoint('md') { - .heading { - grid-template-areas: 'name type'; - grid-template-columns: max-content 1fr; - } - - .heading__link { - font-size: 14px; - } - - .content [class^='Example-module--value'] { - max-width: calc(680px - var(--mm-spacing) - 14px); - } -} - -@include variables.breakpoint('xxl') { - .heading__link { - font-size: 16px; - } - - .content [class^='Example-module--value'] { - max-width: calc(680px - var(--mm-spacing) - 6px); - } -} diff --git a/src/components/Schema/Schema.spec.tsx b/src/components/Schema/Schema.spec.tsx deleted file mode 100644 index 5a2c2d114..000000000 --- a/src/components/Schema/Schema.spec.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import * as React from 'react'; - -import { p as P } from '../Mdx'; -import Property from './Property'; -import Schema from './Schema'; - -import * as styles from './Schema.module.scss'; - -const json = { - bar: 'bar', - baz: { - baz: 'baz', - }, - foo: 'foo', -}; - -describe('Schema', () => { - it('renders children', async () => { - const component = global.mountWithRouter( - -

    This is example text.

    - - -

    This is a property value.

    -
    - - -

    This is a property value.

    -
    -
    - ); - expect(component.find('P')).toHaveLength(1); - expect(component.find('Property')).toHaveLength(2); - }); - - it('infers the schema type', async () => { - const component = global.mountWithRouter( - -

    This is example text.

    -
    - ); - - expect( - component.find(`.${styles['heading__type']}`) - .first().text() - ).toBe('object'); - }); - - it('does not infer the schema type if `json` prop is undefined', async () => { - const spy = jest.spyOn(console, 'error').mockImplementation(); - - const component = global.mountWithRouter( - // @ts-expect-error leaving `json` undefined - -

    This is example text.

    -
    - ); - - expect(component.find(`.${styles['heading__type']}`)).not.toExist(); - expect(console.error).toHaveBeenCalled(); - spy.mockRestore(); - }); - - it('allows a custom schema type to be set', async () => { - const component = global.mountWithRouter( - '} - > -

    This is example text.

    -
    - ); - - expect( - component.find(`.${styles['heading__type']}`) - .first().text() - ).toBe('array'); - }); - - describe('`services` property', () => { - let component: any; - - beforeEach(() => { - component = global.mountWithRouter( - -

    This is example text.

    - - - - -
    - ); - }); - - it( - // eslint-disable-next-line max-len - 'passes `services` to `Property` children that do not have `service` property', - () => { - const property = component.find('Property').at(0); - const serviceTags = property.find('MinFraudServiceTags'); - expect(serviceTags).toHaveLength(1); - expect(serviceTags.props().services).toBe('*'); - } - ); - - it( - // eslint-disable-next-line max-len - '`Property` children that have `services` property defined overrides `service` property of Schema', - () => { - const property = component.find('Property').at(1); - const serviceTags = property.find('MinFraudServiceTags'); - expect(serviceTags).toHaveLength(1); - expect(serviceTags.props().services).toStrictEqual([ - 'factors', - ]); - } - ); - }); -}); diff --git a/src/components/Schema/Schema.tsx b/src/components/Schema/Schema.tsx deleted file mode 100644 index 2b06e4317..000000000 --- a/src/components/Schema/Schema.tsx +++ /dev/null @@ -1,166 +0,0 @@ -// TODO - Figure out correct typings for React children that implement ISchema -/* eslint-disable @typescript-eslint/no-explicit-any */ -import GithubSlugger from 'github-slugger'; -import PropTypes from 'prop-types'; -import * as React from 'react'; -import { FaLink as LinkIcon } from 'react-icons/fa'; - -import { inferType } from '../../utils/json'; -import { formatSchemaName } from '../../utils/openapi'; -import Example from '../Example'; -import Link from '../Link'; -import SchemaContext from './SchemaContext'; -import Tag from './Tag'; - -import * as styles from './Schema.module.scss'; - -export interface ISchema { - children: React.ReactElement | React.ReactElement[]; - json: Json; - jsonPointer: string; - name: string; - productFamily: ProductFamily; - services?: GeoIpServices | MinFraudServices; - type?: SchemaType; -} - -const slug = GithubSlugger.slug; - -const Schema: React.FC = (props) => { - const { - children, - json, - jsonPointer, - name, - productFamily, - services, - type, - } = props; - - const formattedSchemaName = formatSchemaName(name); - - const schemaId = `schema--${slug(formattedSchemaName)}`; - - let inferredType = ''; - - if (typeof json !== 'undefined') { - inferredType = inferType(json); - } - - const schemaContent = React.Children.toArray(children); - - const firstPropertyComponentIndex = schemaContent.findIndex( - (child: any) => child.props.mdxType === 'Property' - ); - - const propertyContent = schemaContent.splice(firstPropertyComponentIndex); - - return ( -
    -
    - - - - {formattedSchemaName} - - - - {(type || inferredType) && ( - - - {type || inferredType} - - - )} -
    -
    - - {schemaContent} - - {json && ( - - <> - {`// JSON Pointer: ${jsonPointer}\n`} - {JSON.stringify(json, null, 2)} - - - )} - - {propertyContent} - -
    -
    - ); -}; - -export const schemaPropTypes = { - children: PropTypes.oneOfType([ - PropTypes.element, - PropTypes.arrayOf( - PropTypes.element.isRequired - ), - ]).isRequired, - json: PropTypes.any.isRequired, - jsonPointer: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - type: PropTypes.oneOf([ - 'array', - 'object', - ] as const), -}; - -Schema.propTypes = { - ...schemaPropTypes, - productFamily: PropTypes.oneOf([ - 'geoip', - 'minfraud', - ] as const).isRequired, - services: PropTypes.oneOfType([ - PropTypes.oneOf([ - '*', - ] as const), - PropTypes.arrayOf( - PropTypes.oneOf([ - 'score', - 'factors', - 'insights', - ] as const).isRequired, - ), - PropTypes.arrayOf( - PropTypes.oneOf([ - 'country', - 'city', - 'insights', - ] as const).isRequired, - ), - ]), -}; - -export default Schema; diff --git a/src/components/Schema/SchemaContext.ts b/src/components/Schema/SchemaContext.ts deleted file mode 100644 index 21d4fefd8..000000000 --- a/src/components/Schema/SchemaContext.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as React from 'react'; - -export type SchemaContextProps = { - id: string; - json: Json; - jsonPointer: string; - productFamily?: ProductFamily; - services?: GeoIpServices | MinFraudServices; -} - -export default React.createContext({ - id: '', - json: {}, - jsonPointer: '', -}); diff --git a/src/components/Schema/ServiceTag.module.scss b/src/components/Schema/ServiceTag.module.scss deleted file mode 100644 index f15704bd8..000000000 --- a/src/components/Schema/ServiceTag.module.scss +++ /dev/null @@ -1,30 +0,0 @@ -.tag { - background: #e9f8f0; - border: 1px solid #c7e4d5; - color: #1c5e3b; - margin: 0 calc(var(--mm-spacing) / 4) calc(var(--mm-spacing) / 4) 0; -} - -.tag::before { - content: '✓'; - margin-right: 4px; -} - -.tag:first-of-type { - margin-left: 0; -} - -.tag:last-of-type { - margin-right: 0; -} - - -.tag__disabled { - background: #eee; - border: 1px solid #ddd; - color: #4f4f4f; -} - -.tag__disabled::before { - content: '✗'; -} diff --git a/src/components/Schema/ServiceTag.spec.tsx b/src/components/Schema/ServiceTag.spec.tsx deleted file mode 100644 index 6977e6329..000000000 --- a/src/components/Schema/ServiceTag.spec.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { mount } from 'enzyme'; -import * as React from 'react'; - -import ServiceTag from './ServiceTag'; - -// eslint-disable-next-line css-modules/no-unused-class -import * as styles from './ServiceTag.module.scss'; - -describe('', () => { - it('renders provided text', () => { - const component = mount( - - ); - - expect( - component.find('ServiceTag').text() - ).toBe('Foo'); - }); - - it('can be disabled', () => { - const component = mount( - - ); - - expect( - component.find('Tag') - ).toHaveClassName(styles['tag__disabled']); - }); -}); diff --git a/src/components/Schema/ServiceTag.tsx b/src/components/Schema/ServiceTag.tsx deleted file mode 100644 index ca7f2e760..000000000 --- a/src/components/Schema/ServiceTag.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import Tag from './Tag'; - -import * as styles from './ServiceTag.module.scss'; - -interface IServiceTag { - isDisabled?: boolean; - text: string; -} - -const ServiceTag: React.FC = (props) => { - const { text, isDisabled } = props; - return ( - - {text} - - ); -}; - -ServiceTag.propTypes = { - isDisabled: PropTypes.bool, - text: PropTypes.string.isRequired, -}; - -export default ServiceTag; diff --git a/src/components/Schema/Tag.module.scss b/src/components/Schema/Tag.module.scss deleted file mode 100644 index 346c02afe..000000000 --- a/src/components/Schema/Tag.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.container { - background: #effbff; - border: 1px solid #d5e3f0; - border-radius: var(--mm-border-radius); - color: #1e588b; - display: inline-block; - font-size: 10px; - font-weight: 700; - letter-spacing: 1px; - padding: 0 10px; -} diff --git a/src/components/Schema/Tag.tsx b/src/components/Schema/Tag.tsx deleted file mode 100644 index 1df415a3e..000000000 --- a/src/components/Schema/Tag.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import * as styles from './Tag.module.scss'; - -interface ITag { - children: React.ReactNode, - className?: string, -} - -const Tag: React.FC = (props) => { - const { children, className } = props; - - return ( - - {children} - - ); -}; - -Tag.propTypes = { - children: PropTypes.node.isRequired, - className: PropTypes.string, -}; - -export default Tag; diff --git a/src/components/Schema/index.ts b/src/components/Schema/index.ts deleted file mode 100644 index bbc63dfe2..000000000 --- a/src/components/Schema/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { default as Footnote } from './Footnote'; -export { default as GeoIpSchema } from './GeoIpSchema'; -export { default as MinFraudSchema } from './MinFraudSchema'; -export { default as Property } from './Property'; -export { default as Schema } from './Schema'; diff --git a/src/components/Schema/types.d.ts b/src/components/Schema/types.d.ts deleted file mode 100644 index 1f3809615..000000000 --- a/src/components/Schema/types.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -declare type ProductFamily = 'geoip' | 'minfraud'; - -declare type MinFraudService = 'score' | 'factors' | 'insights'; -declare type MinFraudServices = '*' | MinFraudService[]; - -declare type GeoIpService = 'country' | 'city' | 'insights'; -declare type GeoIpServices = '*' | GeoIpService[]; - -declare type SchemaType = 'array' | 'object'; -declare type SchemaPropertyType = 'array' - | 'array' - | 'array' - | 'array' - | 'array' - | 'boolean' - | 'number' - | 'integer' - | 'object' - | 'string'; diff --git a/src/components/SearchResult.module.scss b/src/components/SearchResult.module.scss deleted file mode 100644 index 47242ecd3..000000000 --- a/src/components/SearchResult.module.scss +++ /dev/null @@ -1,30 +0,0 @@ -.title b, -.snippet b { - font-weight: bold; -} - -.title { - color: var(--mm-color-logo-blue-light); - display: inline-block; - font-size: 20px; - margin-bottom: 3px; - text-decoration: none; - - &:hover { - text-decoration: underline; - } -} - -.url { - display: block; - font-size: 12px; - margin-bottom: 3px; -} - -.snippet { - font-size: 16px; - - br { - display: none; - } -} diff --git a/src/components/SearchResult.tsx b/src/components/SearchResult.tsx deleted file mode 100644 index 95bfcc483..000000000 --- a/src/components/SearchResult.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { sanitize } from 'dompurify'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import Link from './Link'; - -import * as styles from './SearchResult.module.scss'; - -interface ISearchResult { - className?: string; - snippet: string; - title: string; - url: string; -} - -const sanitizeOpts = { - ALLOWED_TAGS: [ - 'b', - ], -}; - -const SearchResult: React.FC = (props) => ( -
    -

    - -

    - - {props.url} - -

    -

    -); - -SearchResult.propTypes = { - className: PropTypes.string, - snippet: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - url: PropTypes.string.isRequired, -}; - -export default SearchResult; diff --git a/src/components/SystemsStatusIcons.module.scss b/src/components/SystemsStatusIcons.module.scss deleted file mode 100644 index fdf3e4d2c..000000000 --- a/src/components/SystemsStatusIcons.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -.operational { - color: #56f000; -} - -.warning { - color: #fce83a; -} diff --git a/src/components/SystemsStatusIcons.tsx b/src/components/SystemsStatusIcons.tsx deleted file mode 100644 index 70274b9df..000000000 --- a/src/components/SystemsStatusIcons.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { - FaCheckCircle, - FaExclamationTriangle, -} from 'react-icons/fa'; - -import * as styles from './SystemsStatusIcons.module.scss'; - -export const OperationalIcon: React.FC = () => ( - -); - -export const WarningIcon: React.FC = () => ( - -); diff --git a/src/components/ZipFileContent.tsx b/src/components/ZipFileContent.tsx deleted file mode 100644 index 246b8d600..000000000 --- a/src/components/ZipFileContent.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import PropTypes from 'prop-types'; -import * as React from 'react'; - -import { - inlineCode as Code, - p as P, - table as Table, - td as Td, - th as Th, - tr as Tr, -} from './Mdx'; - -interface IZipFileContent { - isTableExcluded?: boolean; - productName: string; -} - -const ZipFileContent: React.FC = (props) => { - const { isTableExcluded, productName } = props; - return ( - <> -

    - The zip file itself is named   - - {productName} - -CSV_ - {'{YYYYMMDD}'} - .zip - - . The downloaded zip file contains a single directory which in turn - contains several files. That directory is named   - - {productName} - -CSV_ - {'{YYYYMMDD}'} - - . -

    - { !isTableExcluded && ( - <> -

    - The files in this zip archive are: -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FilenameDescription
    LICENSE.txtEnd user license
    COPYRIGHT.txtCopyright statement
    - - {productName} - -Blocks-IPv4.csv - - CSV file containing data on IPv4 addresses
    - - {productName} - -Blocks-IPv6.csv - - CSV file containing data on IPv6 addresses
    - - )} - - ); -}; - -ZipFileContent.propTypes = { - isTableExcluded: PropTypes.bool, - productName: PropTypes.string.isRequired, -}; - -export default ZipFileContent; diff --git a/src/gatsby/gatsby-browser/index.ts b/src/gatsby/gatsby-browser/index.ts deleted file mode 100644 index c13a569d5..000000000 --- a/src/gatsby/gatsby-browser/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './onClientEntry'; -export * from './onRouteUpdate'; -export * from './wrapRootElement'; diff --git a/src/gatsby/gatsby-browser/onClientEntry.ts b/src/gatsby/gatsby-browser/onClientEntry.ts deleted file mode 100644 index 142c0f472..000000000 --- a/src/gatsby/gatsby-browser/onClientEntry.ts +++ /dev/null @@ -1,31 +0,0 @@ -import cssVars from 'css-vars-ponyfill'; -import { GatsbyBrowser } from 'gatsby'; - -export const onClientEntry: GatsbyBrowser['onClientEntry'] = async () => { - cssVars(); - - if (!Element.prototype.matches) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Element.prototype.matches = (Element as any).prototype.msMatchesSelector; - } - - if (typeof CustomEvent !== 'function') { - await require('custom-event-polyfill'); - } - - if (typeof fetch === 'undefined') { - await require('whatwg-fetch'); - } - - if (typeof IntersectionObserver === 'undefined') { - await require('intersection-observer'); - } - - if (typeof Promise.all === undefined || typeof Promise.race === 'undefined') { - await require('promise-polyfill/src/polyfill'); - } - - if (typeof URLSearchParams === 'undefined') { - await require('url-search-params-polyfill'); - } -}; diff --git a/src/gatsby/gatsby-browser/onRouteUpdate.ts b/src/gatsby/gatsby-browser/onRouteUpdate.ts deleted file mode 100644 index 00e27230f..000000000 --- a/src/gatsby/gatsby-browser/onRouteUpdate.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { GatsbyBrowser, RouteUpdateArgs } from 'gatsby'; - -const scrollIntoView = (props: RouteUpdateArgs) => - document - .getElementById(props.location.hash.replace('#', ''))?.scrollIntoView(); - -export const onRouteUpdate: GatsbyBrowser['onRouteUpdate'] = (props) => { - if (props.location.hash) { - document.addEventListener('mm-react-code-mount', function handler(e) { - e.currentTarget?.removeEventListener(e.type, handler); - scrollIntoView(props); - }); - - scrollIntoView(props); - } -}; diff --git a/src/gatsby/gatsby-browser/wrapRootElement.tsx b/src/gatsby/gatsby-browser/wrapRootElement.tsx deleted file mode 100644 index 358be42bf..000000000 --- a/src/gatsby/gatsby-browser/wrapRootElement.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { MDXProvider } from '@mdx-js/react'; -import { GatsbyBrowser, WrapRootElementBrowserArgs } from 'gatsby'; -import React from 'react'; -import { IconContext } from 'react-icons'; - -import * as components from '../../components/Mdx'; -import { StoreProvider } from '../../store'; - -export const wrapRootElement: GatsbyBrowser['wrapRootElement'] = ( - props: WrapRootElementBrowserArgs -) => ( - - {/* eslint-disable-next-line max-len */ } - {/* @ts-expect-error: @type for @mdx-js/react has implicit children which is incompat with react 18 */} - - - {props.element} - - - -); diff --git a/src/gatsby/gatsby-config/feeds/createReleaseNotesFeed.ts b/src/gatsby/gatsby-config/feeds/createReleaseNotesFeed.ts deleted file mode 100644 index 8512e5526..000000000 --- a/src/gatsby/gatsby-config/feeds/createReleaseNotesFeed.ts +++ /dev/null @@ -1,98 +0,0 @@ -import GithubSlugger from 'github-slugger'; -import toHtml from 'hast-util-to-html'; -import toHast from 'mdast-util-to-hast'; -// eslint-disable-next-line import/no-unresolved -import type { Parent } from 'unist'; - -interface IFeed { - description: string; - inputUrl: string; - outputUrl: string; - title: string; -} - -export default (feed: IFeed): any => ({ - description: `${feed.description}`, - generator: '', - output: `${feed.outputUrl}`, - query: ` - { - allMdx( - filter: { - fields: { - slug: { - eq: "${feed.inputUrl}" - } - } - } - ) { - nodes { - frontmatter { - title - description - image - keywords - draft - } - fields { - slug - } - mdxAST - } - } - } - `, - serialize: (args: any) => { - const { query } = args; - const { site, allMdx } = query; - - return allMdx.nodes.flatMap((node: any) => { - const releaseNotes = (node.mdxAST as Parent).children.filter( - (child: any) => child.name === 'ReleaseNote' - ); - - return releaseNotes.map((releaseNote: any) => { - const dateAttribute = (releaseNote.attributes as any[]).find( - (attribute: any) => attribute.name === 'date' - ); - - const titleAttribute = (releaseNote.attributes as any[]).find( - (attribute: any) => attribute.name === 'title' - ); - - if (!dateAttribute?.value) { - throw Error('`date` attribute value is missing'); - } - - if (!titleAttribute?.value) { - throw Error('`title` attribute value is missing'); - } - - // Assume publish time is around noon office standard time - const dateString = `${dateAttribute.value} 12:00:00 GMT -0400`; - - const url = [ - site.siteMetadata.siteUrl, - node.fields.slug, - `#${GithubSlugger.slug(titleAttribute.value)}`, - ].join(''); - - return { - ...node.frontmatter, - custom_elements: [ - { - 'content:encoded': (releaseNote.children as any[]) - .map((child: any) => toHtml(toHast(child))) - .join(''), - }, - ], - date: new Date(dateString), - guid: url, - title: titleAttribute.value, - url, - }; - }); - }); - }, - title: feed.title, -}); diff --git a/src/gatsby/gatsby-config/feeds/createServerIpAddressesFeed.ts b/src/gatsby/gatsby-config/feeds/createServerIpAddressesFeed.ts deleted file mode 100644 index 868c9703d..000000000 --- a/src/gatsby/gatsby-config/feeds/createServerIpAddressesFeed.ts +++ /dev/null @@ -1,48 +0,0 @@ -export default (): any => ({ - description: 'Feed of MaxMind server addresses.', - generator: '', - output: 'maxmind-server-ip-addresses.xml', - query: ` - { - allJson { - nodes { - IPv4 - IPv6 - lastUpdated - } - } - site { - siteMetadata { - siteUrl - } - } - } - `, - serialize: (args: any) => { - const { query } = args; - const { allJson } = query; - const { siteUrl } = query.site.siteMetadata; - - const date = new Date(allJson.nodes[0].lastUpdated); - - return [ - { - custom_elements: [ - { - // eslint-disable-next-line security/detect-object-injection - 'content:encoded': [ - ...allJson.nodes[0].IPv4, - '', - ...allJson.nodes[0].IPv6, - ].join('
    '), - }, - ], - date, - guid: `${siteUrl}/maxmind-server-ip-addresses?t=${date.getTime()}`, - title: 'MaxMind Server IP Addresses', - url: `${siteUrl}/maxmind-server-ip-addresses`, - }, - ]; - }, - title: 'MaxMind Server IP Addresses', -}); diff --git a/src/gatsby/gatsby-config/index.ts b/src/gatsby/gatsby-config/index.ts deleted file mode 100644 index 006cf7413..000000000 --- a/src/gatsby/gatsby-config/index.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { GatsbyConfig } from 'gatsby'; -import remarkExternalLinks from 'remark-external-links'; - -import createReleaseNotesFeed from './feeds/createReleaseNotesFeed'; -import createServerIpAddressesFeed from './feeds/createServerIpAddressesFeed'; -import sectionize from './remark/sectionize'; - -const { GATSBY_URL = 'http://localhost:5000' } = process.env; - -/** - * The plugins below must come last in the ordering of the plugins because they - * are dependent on transforming output of the previously listed plugins. - */ -const THESE_PLUGINS_MUST_COME_LAST = [ - 'gatsby-plugin-sri', -]; - -const GATSBY_ROOT = `${__dirname}/../../../`; - -const GLOBALLY_IGNORED_SOURCE_FILES = [ - '**/_**/*', - '**/_*', -]; - -export default { - plugins: [ - { - options: { - id: 'GTM-M8K593P', - includeInDevelopment: false, - }, - resolve: 'gatsby-plugin-google-tagmanager', - }, - { - options: { - typeName: 'Json', - }, - resolve: 'gatsby-transformer-json', - }, - { - options: { - name: 'maxmindServerIps', - path: `${GATSBY_ROOT}/static/maxmind-server-ip-addresses.json`, - }, - resolve: 'gatsby-source-filesystem', - }, - { - options: { - ignore: [ - ...GLOBALLY_IGNORED_SOURCE_FILES, - '**/index.mdx', - ], - name: 'pages', - path: `${GATSBY_ROOT}/content/`, - }, - resolve: 'gatsby-source-filesystem', - }, - { - options: { - ignore: [ - ...GLOBALLY_IGNORED_SOURCE_FILES, - '**/!(content)/index.mdx', - ], - name: 'home', - path: `${GATSBY_ROOT}/content/`, - }, - resolve: 'gatsby-source-filesystem', - }, - { - options: { - ignore: [ - ...GLOBALLY_IGNORED_SOURCE_FILES, - '**/!(index).mdx', - ], - name: 'overviews', - path: `${GATSBY_ROOT}/content/`, - }, - resolve: 'gatsby-source-filesystem', - }, - { - options: { - defaultLayouts: { - home: require.resolve(`${GATSBY_ROOT}src/templates/Home`), - overviews: require.resolve(`${GATSBY_ROOT}src/templates/Overview`), - pages: require.resolve(`${GATSBY_ROOT}src/templates/Page`), - }, - extensions: [ - '.mdx', - '.md', - ], - remarkPlugins: [ - sectionize, - remarkExternalLinks, - ], - }, - resolve: 'gatsby-plugin-mdx', - }, - 'gatsby-plugin-react-helmet', - { - options: { - name: 'images', - path: `${GATSBY_ROOT}src/images`, - }, - resolve: 'gatsby-source-filesystem', - }, - 'gatsby-plugin-typescript', - 'gatsby-plugin-ts-checker', - 'gatsby-plugin-image', - 'gatsby-transformer-sharp', - 'gatsby-plugin-sharp', - { - options: { - background_color: '#0b8ad0', - display: 'minimal-ui', - icon: 'src/images/maxmind-icon.png', - name: 'MaxMind Developer Portal', - start_url: '/', - theme_color: '#0b8ad0', - }, - resolve: 'gatsby-plugin-manifest', - }, - { - options: { - rule: { - include: /assets/, - }, - }, - resolve: 'gatsby-plugin-react-svg', - }, - { - options: { - feeds: [ - // The year needs to be hardcoded. A page for the new year's - // release notes won't exist until a new MDX file is created - // in the /content//release-notes folder for that new year. - createReleaseNotesFeed({ - description: 'Release notes for MaxMind\'s GeoIP2 product line', - inputUrl: '/geoip/release-notes/2024', - outputUrl: '/geoip/release-notes/rss.xml', - title: 'GeoIP2 Release Notes', - }), - createReleaseNotesFeed({ - description: 'Release notes for MaxMind\'s minFraud product line', - inputUrl: '/minfraud/release-notes/2024', - outputUrl: '/minfraud/release-notes/rss.xml', - title: 'minFraud Release Notes', - }), - createServerIpAddressesFeed(), - ], - query: ` - { - site { - siteMetadata { - title - description - siteUrl - site_url: siteUrl - } - } - } - `, - }, - resolve: 'gatsby-plugin-feed', - }, - 'gatsby-plugin-advanced-sitemap', - { - options: { - env: { - nonProduction: { - policy: [ - { - disallow: [ - '/', - ], - userAgent: '*', - }, - ], - }, - production: { - policy: [ - { - allow: '/', - userAgent: '*', - }, - ], - }, - }, - host: GATSBY_URL, - resolveEnv: () => GATSBY_URL === 'https://dev.maxmind.com' - ? 'production' - : 'nonProduction', - sitemap: `${GATSBY_URL}/sitemap.xml`, - }, - resolve: 'gatsby-plugin-robots-txt', - }, - ...THESE_PLUGINS_MUST_COME_LAST, - ], - siteMetadata: { - author: '@maxmind', - // eslint-disable-next-line max-len - description: 'Develop applications using industry-leading IP intelligence and risk scoring.', - siteUrl: GATSBY_URL, - title: 'MaxMind Developer Portal', - }, - trailingSlash: 'never', -} as GatsbyConfig; diff --git a/src/gatsby/gatsby-config/remark/sectionize.spec.ts b/src/gatsby/gatsby-config/remark/sectionize.spec.ts deleted file mode 100644 index 45697cecb..000000000 --- a/src/gatsby/gatsby-config/remark/sectionize.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import remark from 'remark'; -import html from 'remark-html'; - -import sectionize from './sectionize'; - -const content = -`# Heading 1 -## Heading 2 -Additional text. - -Additional text. - -### Heading 3 -Additional text. - -Additional text. - -## Heading 2 -Additional text. -`.trim(); - -describe('sectionize', () => { - it('default export returns a function', () => { - expect(sectionize()).toBeInstanceOf(Function); - }); - - it('generated output matches expected html structure', async () => { - const output = await remark() - .use(sectionize) - .use(html) - .process(content) - .then((result: any) => String(result).trim()); - - const expected = [ - /* eslint-disable indent */ - '
    ', - '

    Heading 1

    ', - - '
    ', - '

    Heading 2

    ', - '

    Additional text.

    ', - '

    Additional text.

    ', - - '
    ', - '

    Heading 3

    ', - '

    Additional text.

    ', - '

    Additional text.

    ', - '
    ', - '
    ', - - '
    ', - '

    Heading 2

    ', - '

    Additional text.

    ', - '
    ', - '
    ', - /* eslint-enable indent */ - ].join(''); - - expect(output).toEqual(`${expected}`); - }); -}); diff --git a/src/gatsby/gatsby-config/remark/sectionize.ts b/src/gatsby/gatsby-config/remark/sectionize.ts deleted file mode 100644 index 4903745a7..000000000 --- a/src/gatsby/gatsby-config/remark/sectionize.ts +++ /dev/null @@ -1,69 +0,0 @@ -import GithubSlugger from 'github-slugger'; -import toString from 'mdast-util-to-string'; -// eslint-disable-next-line import/no-unresolved -import { Parent } from 'unist'; -import visitParents, { Visitor } from 'unist-util-visit-parents'; - -// eslint-disable-next-line @typescript-eslint/no-var-requires -const findAfter = require('unist-util-find-after'); - -const MAX_HEADING_DEPTH = 6; - -const slugger = new GithubSlugger(); - -type TransformFn = (tree: any) => void; - -const transform: TransformFn = (tree: any) => { - slugger.reset(); - - for (let depth = MAX_HEADING_DEPTH; depth > 0; depth--) { - visitParents( - tree, - (node: any) => node.type === 'heading' && node.depth === depth, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - visitor as Visitor, - ); - } -}; - -const visitor = (node: any, ancestors: Parent[]) => { - const data = node.data || (node.data = {}); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const props = data.hProperties || (data.hProperties = {}) as any; - - props.id = props.id - ? slugger.slug(props.id, true) - : slugger.slug(toString(node)); - - const start = node; - const depth = start.depth as number; - const parent = ancestors[ancestors.length - 1]; - - const isEnd = (node: any) => node.type === 'heading' - && (node.depth as number) <= depth || node.type === 'export'; - - const end = findAfter(parent, start, isEnd); - - const startIndex = parent.children.indexOf(start); - const endIndex = parent.children.indexOf(end); - - const section = { - children: parent.children.slice( - startIndex, - endIndex > 0 ? endIndex : undefined - ), - data: { - hName: 'div', - hProperties: { - id: `toc-${props.id}`, - }, - }, - depth: depth, - type: 'div', - }; - - parent.children.splice(startIndex, section.children.length, section); -}; - -export default (): TransformFn => transform; diff --git a/src/gatsby/gatsby-node/createPages.ts b/src/gatsby/gatsby-node/createPages.ts deleted file mode 100644 index a89374b6f..000000000 --- a/src/gatsby/gatsby-node/createPages.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CreatePagesArgs, GatsbyNode } from 'gatsby'; - -import createMdxPages from './pages/createMdxPages'; - -export const createPages: GatsbyNode['createPages'] = async ( - props: CreatePagesArgs -) => { - await Promise.all([ - createMdxPages(props), - ]); -}; diff --git a/src/gatsby/gatsby-node/createResolvers.ts b/src/gatsby/gatsby-node/createResolvers.ts deleted file mode 100644 index 29af4269e..000000000 --- a/src/gatsby/gatsby-node/createResolvers.ts +++ /dev/null @@ -1,69 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { - CreateResolversArgs, - GatsbyNode, -} from 'gatsby'; - -const genMDX = require('gatsby-plugin-mdx/utils/gen-mdx'); - -// eslint-disable-next-line max-len -import generateTableOfContents, { createImportPathMap } from '../../utils/get-toc-items'; - -const geoipImportPathMap = createImportPathMap( - `${process.cwd()}/content/geoip/docs/web-services/_schemas` -); - -const minFraudImportPathMap = createImportPathMap( - `${process.cwd()}/content/minfraud/api-documentation/_schemas` -); - -export const createResolvers: GatsbyNode['createResolvers'] = async( - args: CreateResolversArgs, -): Promise => { - const { - createResolvers, - store, - } = args; - - const plugins = store.getState().flattenedPlugins; - - const mdxPlugin = plugins.find( - (plugin: any) => plugin.name === 'gatsby-plugin-mdx' - ); - - const processMDX = ({ node }: any) => - genMDX({ - ...args, - node, - options: mdxPlugin.pluginOptions, - }); - - createResolvers({ - Mdx: { - customTableOfContents: { - args: { - maxDepth: { - default: 6, - type: 'Int', - }, - }, - async resolve(mdxNode: any) { - const { mdast } = await processMDX({ - node: mdxNode, - }); - - if (mdxNode.fields.slug.startsWith('/minfraud')) { - return generateTableOfContents(mdast, minFraudImportPathMap); - } - - if (mdxNode.fields.slug.startsWith('/geoip')) { - return generateTableOfContents(mdast, geoipImportPathMap); - } - - return; - }, - type: 'JSON', - }, - }, - }); -}; diff --git a/src/gatsby/gatsby-node/createSchemaCutomization.ts b/src/gatsby/gatsby-node/createSchemaCutomization.ts deleted file mode 100644 index a31ecb96d..000000000 --- a/src/gatsby/gatsby-node/createSchemaCutomization.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CreatePagesArgs, GatsbyNode } from 'gatsby'; - -export const createSchemaCustomization: GatsbyNode['createSchemaCustomization'] = - async ({ actions }) => { - const { createTypes } = actions; - const typeDefs = ` - type Mdx implements Node { - frontmatter: MdxFrontmatter! - } - type MdxFrontmatter { - image: String - } - `; - createTypes(typeDefs); - }; diff --git a/src/gatsby/gatsby-node/index.ts b/src/gatsby/gatsby-node/index.ts deleted file mode 100644 index 422272c13..000000000 --- a/src/gatsby/gatsby-node/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './createPages'; -export * from './createResolvers'; -export * from './onCreateNode'; -export * from './onCreateWebpackConfig'; -export * from './createSchemaCutomization'; diff --git a/src/gatsby/gatsby-node/onCreateNode.ts b/src/gatsby/gatsby-node/onCreateNode.ts deleted file mode 100644 index b863a45e3..000000000 --- a/src/gatsby/gatsby-node/onCreateNode.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { CreateNodeArgs, GatsbyNode } from 'gatsby'; -import { createFilePath } from 'gatsby-source-filesystem'; - -const addLayoutField = (args: CreateNodeArgs): void => { - const { actions, getNode, node } = args; - const { createNodeField } = actions; - - if (node?.internal?.type === 'Mdx') { - const parentId = node?.parent; - - if (!parentId) { - return; - } - - const parentNode = getNode(parentId); - - createNodeField({ - name: 'layout', - node, - value: parentNode?.sourceInstanceName, - }); - } -}; - -const addSlugField = (args: CreateNodeArgs): void => { - const { actions, getNode, node } = args; - const { createNodeField } = actions; - - if (node.internal.type === 'Mdx') { - const slug = createFilePath({ - getNode, - node, - trailingSlash: false, - }); - - createNodeField({ - name: 'slug', - node, - value: slug, - }); - } - -}; - -export const onCreateNode: GatsbyNode['onCreateNode'] = ( - args: CreateNodeArgs, -) => { - addLayoutField(args); - addSlugField(args); -}; diff --git a/src/gatsby/gatsby-node/onCreateWebpackConfig.ts b/src/gatsby/gatsby-node/onCreateWebpackConfig.ts deleted file mode 100644 index f20540093..000000000 --- a/src/gatsby/gatsby-node/onCreateWebpackConfig.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { exec } from 'child_process'; -import { CreateWebpackConfigArgs, GatsbyNode } from 'gatsby'; -import reporter from 'gatsby-cli/lib/reporter'; - -/* eslint-disable @typescript-eslint/no-var-requires */ -const ESLintPlugin = require('eslint-webpack-plugin'); -const StylelintPlugin = require('stylelint-webpack-plugin'); - -export const onCreateWebpackConfig: GatsbyNode['onCreateWebpackConfig']= ( - props: CreateWebpackConfigArgs, -) => { - const IS_DEVELOP = props.stage === 'develop'; - const IS_PRODUCTION = !IS_DEVELOP; - const IS_SSR = props.stage.includes('html'); - - const sassLoader = { - loader: 'sass-loader', - options: { - sourceMap: IS_PRODUCTION, - }, - }; - - const sassRule = { - test: /\.s(a|c)ss$/, - use: IS_SSR - ? [ - props.loaders.null(), - ] - : [ - props.loaders.miniCssExtract(), - props.loaders.css({ - camelCase: true, - importLoaders: 2, - }), - { - loader: 'postcss-loader', - }, - sassLoader, - ], - }; - - const sassRuleModules = { - test: /\.module\.s(a|c)ss$/, - use: [ - !IS_SSR && props.loaders.miniCssExtract({ - modules: true, - }), - props.loaders.css({ - camelCase: true, - importLoaders: 2, - modules: true, - }), - { - loader: 'postcss-loader', - }, - sassLoader, - ].filter(Boolean), - }; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let configRules: any = []; - - switch (props.stage) { - case 'develop': - case 'build-javascript': - case 'build-html': - case 'develop-html': { - configRules = configRules.concat([ - { - oneOf: [ - sassRuleModules, - sassRule, - ], - }, - ]); - break; - } - } - - props.actions.setWebpackConfig({ - module: { - rules: configRules, - }, - }); - - /** - * In the development environment, we want eslint to parse files on change and - * output any issues to console. - */ - if (IS_DEVELOP) { - props.actions.setWebpackConfig({ - plugins: [ - new ESLintPlugin({ - exclude: [ - 'node_modules', - '.cache', - 'public', - ], - extensions: [ - 'js', - 'json', - 'md', - 'mdx', - 'ts', - 'tsx', - ], - }), - new StylelintPlugin({ - configFile: './.stylelintrc.js', - files: 'src/**/*.s(a|c)ss', - }), - { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - apply: (compiler: any) => { - compiler.hooks.afterEmit.tapAsync( - 'RemarkLint', - (_: unknown, next: () => void) => exec( - 'remark . --ext mdx --quiet', - (_: unknown, stdout: string, stderr: string) => { - if (stdout) { - reporter.info(stdout); - } - - if (stderr) { - reporter.warn(`RemarkLint error:\n${stderr}`); - } - - next(); - } - )); - }, - }, - ], - }); - } -}; diff --git a/src/gatsby/gatsby-node/pages/createMdxPages.ts b/src/gatsby/gatsby-node/pages/createMdxPages.ts deleted file mode 100644 index 69362e75c..000000000 --- a/src/gatsby/gatsby-node/pages/createMdxPages.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import { CreatePagesArgs } from 'gatsby'; - -import { IBaseQuery } from '../../../baseQuery'; -import homeQuery from '../../../templates/Home/query'; -import overviewQuery from '../../../templates/Overview/query'; -import pageQuery from '../../../templates/Page/query'; - -const queries = [ - homeQuery, - overviewQuery, - pageQuery, -]; - -const createMdxPages = async (args: CreatePagesArgs): Promise => { - const { actions, graphql, reporter } = args; - const { createPage } = actions; - - return Promise.all( - queries.map(async (query) => { - const result = await query(graphql); - - if (result.errors) { - reporter.panicOnBuild('🚨 ERROR: error!'); - console.log(result.errors); - throw new Error(`🚨 ERROR: Loading "${query.name}" query`); - } - - if (!result.data) { - reporter.panicOnBuild('🚨 ERROR: No data!'); - throw new Error('🚨 ERROR: No data!'); - } - - result.data.allMdx.nodes.forEach((node: IBaseQuery) => { - if ( - process.env.gatsby_executing_command === 'develop' - || !node.frontmatter.draft - ) { - createPage({ - component: node.fileAbsolutePath, - context: node, - path: node.fields.slug, - }); - } - }); - }) - ); -}; - -export default createMdxPages; diff --git a/src/gatsby/gatsby-ssr/index.ts b/src/gatsby/gatsby-ssr/index.ts deleted file mode 100644 index c2be55e74..000000000 --- a/src/gatsby/gatsby-ssr/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './replaceRenderer'; -export * from './wrapRootElement'; diff --git a/src/gatsby/gatsby-ssr/replaceRenderer.tsx b/src/gatsby/gatsby-ssr/replaceRenderer.tsx deleted file mode 100644 index 318505067..000000000 --- a/src/gatsby/gatsby-ssr/replaceRenderer.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import cheerio from 'cheerio'; -import crypto from 'crypto'; -import fs from 'fs'; -import { GatsbySSR, ReplaceRendererArgs } from 'gatsby'; -import GithubSlugger from 'github-slugger'; -import React from 'react'; -import { renderToString } from 'react-dom/server'; - -const slugger = new GithubSlugger(); - -const extractInlinedStyles = (args: ReplaceRendererArgs) => { - const { - bodyComponent, - pathname, - replaceBodyHTMLString, - setHeadComponents, - } = args; - - const $ = cheerio.load( - renderToString(bodyComponent as React.ReactElement) - ); - const cssRules: string[] = []; - - const $elements = $('[style]'); - - $elements.map((_: number, element) => { - const $element = $(element); - const styles = $element.attr('style'); - const className = `inlined__${crypto - .randomBytes(4) - .toString('hex') - }`; - $element.addClass(className); - cssRules.push(`.${className} { ${styles}; }`); - $element.removeAttr('style'); - }); - - // eslint-disable-next-line quotes - const css = cssRules.join("\n"); - - const filenameHash = crypto - .randomBytes(10) - .toString('hex'); - - const cssFileNameBase = (pathname as string) - .replace(/^\/|\/$/g, '') - .replace('.html', ''); - - const cssFileName = - `inline---${slugger.slug(cssFileNameBase) || 'index'}.${filenameHash}.css`; - - const integrityHash = crypto - .createHash('sha512') - .update(css) - .digest('base64'); - - // eslint-disable-next-line security/detect-non-literal-fs-filename - fs.writeFileSync(`public/${cssFileName}`, css, 'utf-8'); - - setHeadComponents([ - ( - - ), - ] as React.ReactNode[]); - - replaceBodyHTMLString($('body').html() as string); -}; - -const addHubspotChat = (args: ReplaceRendererArgs) => { - const { setPostBodyComponents } = args; - - /* eslint-disable react/jsx-key */ - setPostBodyComponents([ - , - ]); - /* eslint-enable react/jsx-key */ -}; - -export const replaceRenderer: GatsbySSR['replaceRenderer'] = ( - args: ReplaceRendererArgs -): any => { // eslint-disable-line @typescript-eslint/no-explicit-any - addHubspotChat(args); - extractInlinedStyles(args); -}; diff --git a/src/gatsby/gatsby-ssr/wrapRootElement.tsx b/src/gatsby/gatsby-ssr/wrapRootElement.tsx deleted file mode 100644 index 8e63e45ff..000000000 --- a/src/gatsby/gatsby-ssr/wrapRootElement.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { MDXProvider } from '@mdx-js/react'; -import { GatsbySSR, WrapRootElementNodeArgs } from 'gatsby'; -import React from 'react'; -import { IconContext } from 'react-icons'; - -import * as components from '../../components/Mdx'; -import { StoreProvider } from '../../store'; - -export const wrapRootElement: GatsbySSR['wrapRootElement'] = ( - props: WrapRootElementNodeArgs -): any => ( // eslint-disable-line @typescript-eslint/no-explicit-any - - {/* eslint-disable-next-line max-len */ } - {/* @ts-expect-error: @type for @mdx-js/react has implicit children which is incompat with react 18 */} - - - {props.element} - - - -); diff --git a/src/globals.d.ts b/src/globals.d.ts deleted file mode 100644 index 9f9e13019..000000000 --- a/src/globals.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module '*.scss' { - const content: {[className: string]: string}; - export = content; -} - -declare module '*.svg' { - import * as React from 'react'; - export const ReactComponent: React.FC>; - export default ReactComponent; -} diff --git a/src/hooks/useActiveHeading.ts b/src/hooks/useActiveHeading.ts deleted file mode 100644 index 75da6b48f..000000000 --- a/src/hooks/useActiveHeading.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import forEach from 'lodash.foreach'; -import { useEffect, useState } from 'react'; - -const useActiveHeading = (headingIds: string[]): string => { - const [ - activeHeading, - setActiveHeading, - ] = useState(''); - - useEffect(() => { - const observer = new IntersectionObserver( - (entries) => { - forEach(entries, (entry) => { - if (entry.isIntersecting) { - setActiveHeading(entry.target.id); - } - }); - }, - { - // TODO - Adjust margin from bottom based on height of viewport in px - rootMargin: '0% 0% -80% 0%', - }, - ); - - const headings: HTMLElement[] = headingIds.reduce( - (accumulator: HTMLElement[], headingId: string) => { - const element = headingId.startsWith('schema--') - ? document.getElementById(headingId) - : document.getElementById(`toc-${headingId}`); - - if (!element) { - return accumulator; - } - - return [ - ...accumulator, - element, - ]; - }, - [], - ); - - headings.forEach((heading: HTMLElement) => { - observer.observe(heading); - }); - - return () => { - headings.forEach((heading: HTMLElement) => { - observer.unobserve(heading); - }); - }; - }, [ - headingIds, - ]); - - return activeHeading; -}; - -export default useActiveHeading; diff --git a/src/hooks/useIsClient.ts b/src/hooks/useIsClient.ts deleted file mode 100644 index 2ae69ca98..000000000 --- a/src/hooks/useIsClient.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import { useEffect, useState } from 'react'; - -type IsClient = { - isClient: boolean; - key: string; -} - -const useIsClient = (): IsClient => { - const [ - isClient, - setClient, - ] = useState(false); - const key = isClient ? 'client' : 'server'; - - useEffect(() => { - setClient(true); - }, []); - - return { - isClient, - key, - }; -}; - -export default useIsClient; diff --git a/src/hooks/useSystemStatus.tsx b/src/hooks/useSystemStatus.tsx deleted file mode 100644 index fcfc7d887..000000000 --- a/src/hooks/useSystemStatus.tsx +++ /dev/null @@ -1,114 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import * as React from 'react'; - -import { - OperationalIcon, - WarningIcon, -} from '../components/SystemsStatusIcons'; - -type SystemStatus = { - class: string; - icon: JSX.Element; - message?: string; - title: string; -} - -// https://kb.status.io/developers/status-codes/ -const status: Record = { - 100: { - class: 'operational', - icon: , - title: 'Operational', - }, - 200: { - class: 'planned_maintenance', - icon: , - message: 'We are currently undergoing some scheduled maintenance.', - title: 'Planned Maintenance', - }, - 300: { - class: 'degraded_performance', - icon: , - // eslint-disable-next-line max-len - message: 'We are currently experiencing degraded performance in some of our web services.', - title: 'Degraded Performance', - }, - 400: { - class: 'partial_service_disruption', - icon: , - message: 'Some of our web services are temporarily unavailable.', - title: 'Partial Service Disruption', - }, - 500: { - class: 'service_disruption', - icon: , - message: 'Our web services are temporarily unavailable.', - title: 'Service Disruption', - }, - 600: { - class: 'security_event', - icon: , - // eslint-disable-next-line max-len - message: 'We are currently mitigating issues relating to some of our web services.', - title: 'Security Event', - }, -}; - -const useSystemStatus = (): null | SystemStatus => { - const [ - systemStatus, - setSystemStatus, - ] = React.useState(null); - - const getSystemStatus = () => fetch( - 'https://status.maxmind.com/1.0/status/53fcfbb2ac0c957972000235', - ) - .then(res => res.json()) - .then(json => { - const status_code = Number(json.result.status_overall.status_code); - if (!(status_code in status)) { - throw new TypeError('status_code invalid'); - } - if (json.result.incidents.length != 0) { - setSystemStatus({ - class: '', - icon: , - message: json.result.incidents[0].name, - title: status[Number(status_code)].title, - }); - return; - } - else if (json.result.maintenance.active.length != 0) { - setSystemStatus({ - class: '', - icon: , - message: json.result.maintenance.active[0].name, - title: status[Number(status_code)].title, - }); - return; - } - setSystemStatus(status[Number(status_code)]); - }) - .catch(() => { - /** - * No-op - * - * If something goes wrong, we intentionally want to swallow the error - * and prevent the UI from knowing - */ - }); - - React.useEffect(() => { - getSystemStatus(); - - const intervalId = setInterval(() => { - getSystemStatus(); - }, 30 * 1000); - - return () => clearInterval(intervalId); - }, []); - - return systemStatus; -}; - -export default useSystemStatus; diff --git a/src/images/maxmind-icon.png b/src/images/maxmind-icon.png deleted file mode 100644 index 8f11ac2b2497a152bfdc4cd44e87f89b16b8ba5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11436 zcmeHtcT`i`_HO9C3(^TyKmvpg(n9Y@ks?I`BoI0zbU`{umEL=Af;0gIL7E8CkuFFP zQKTasUi6%M?>Xc58{>^T#(V#rWbB>2*ZStS=KR)NYiF(G>3tnl5<+@H002OuuBN1q z{#5*R;Nzmt1Mgdr000e(pP>m#ALq^FhD?0H65}S*BhLZE4Ck z;AncxbGU^4jGu7D=NVaijWpPtPWksW)65bjTy}mJBt7*X89L%GYLLPIKp%C-%s zv)g7)orjvuqi+IPa^p_+uVX$R=UrTT9$rUma$a4Zzxpz>?^^fjgi2aBcX=X`YWmF2 z=JAb6Ox@v(?j1i1Zf>?wf$yG0Kc)2cMj3WIL$3LTz8DP+aK>IqzmdHu3BHMA9y!vk zE8Ty6a<*&o?vsZ39iKO$L}>%$msIj&H=n{r81hs@Hsnd$>q;)ZS|&bwR(Ei8oiLPD ze19z+FTgnUWO;F>E_-x3`r1?NG-dtr`f}rYe`#H{hr!K@C*Qt{-&}onZaq*s;<*q% zvztcF4DJxqjxkcSpQE|f%_&;U@7FD@zEfMj-4vR?m33&i+WIx^ z`%Y^>etC8n?Uh*PUd+j4IctX zGe-Ii3{H_gxwN@H!rHXImD6}EW8AyZk)%yqmBTC<8{K-S;m}SHcyV^A>q%lL$TLKr zsA4^Uj80q>=fHnC7K}wTI!fH$V0j0qY%WDXOhwN0z=qk}tHtM04truMrl-OQ>p29+ zTqBU8B!Sh|!JvcxgKG4v$n$mIxjiW>6;6G?*9vW-TY~k4 z$amoK9ONKopQXanvXUfCp5~?r$BGwaS&o&>E%Vu~7-L$XmlF<-wcgL?B$1nwxmbQI zfngM?LhK1b-|UNZ=k5A4;d!u+bMQxj;W&XcuisZy*LE(IrFtzQHZ8oCoKF<1bFFlw zx7H1GWPTi-RCT;R?-^w={LoSL#kCY=y!El@=G=OD_ z#qPay<@tqH<^l7>GVIUmI}e`Z^BlgYl!ZGqJ!YI}%OhdWotBRX@Q{-I`Jz#-fN(qS z@z#gwjt^>_E-N92VnG6ZA07EtbS~OMmj%9f!Syy~=V$moba`>ci#{F}ZhL5S;_pJ# z87^!<_+C-!s&cMPeJ`>7tj3_Z>7_v2jTXI{k%;zSp$-SNd^QbG*=vNZq_)-c?J!{W z=j-~9gi4w3j~w?UM%~)torPj*#kZFzDQ4PY%n)fi=d_PVdIktz_8_P@P5Kl3Cw#ov zghzQgSlU{}G#hX-Ks;_mYwr);X)=th6HD)};$WtCMU^xxyk|ecN$q|8@;g&BgUo}X z?^Mt3n6}hCD(hrEtOlzQ?U)28@bXHoEDsUD;xkQ)9HadrEtj6p9VJH-nFqwmn?S+} ztFO849V2J5b)ECYq>0F01_&Q~-*{{ucLtR_(fTN>c1TUrN#=7ZG4&;~lAlTD_K$r2 z(Z}FvSIGX}wHC<*U-J)1Yx*%H^PXf;!12I?%;%Yhi7#SG%WriY#$i!W6Me%YW3@Z) z=gd+`JoWIib{jE?J~UTOp=591=AJb4nt5Fo3st%neq5_s?X?zT*cHT1W3e~Ue45ecoZ9n8VNU0bV#x*b~=;veGvI!zz=Td?9=^5!B_4NLrvcz9{I52-jt#m3qz zF&RnJR7}fdXa_QDS&vb4R7D>m!n?P%pjO!NyU1ta9*+jzcClG4RW{p2r*Ak3Z({vC z49jlOE9Q9{xAayI`eqAT++?qJgGQ*&^yhm%zugTccCl3P8oIc4qbB_Gw&-AhyuIJ0 zggxs^@)nigZx1*wboN%?avTLe^l}L%iErN2!-*_e>!K{Kg*#*>ehW=FvO1`6kGXyx zsZ!@y)24pN4<^k|$HxuJHPyd5opLw9z+yhxfy+&<*Wy3Qx%o*v{eh$AK-e8xBECYC zGPPal4jKkn5S*1P@r z$-VVRc0pwwthVi^$~z%>`w@?02TNx1wI_Z;{rCIVFa5`t{98n*xyrFv5ILUEFambG z0%m=-AI%u)-|#TQJSV~n=B(VT7L}6NQ}8Rg;vNd6W0_y#+Qw$!aT-z3P{>R#>9oaF zSF|1tQdzpzl%)`lg$|(*Qcs8MIbrie&Y$R1&gwmwq5RQzxyuGNZ0J65Q^9X@CDSLA z3xEA#AtxTQ$9=liFris2SA!oZ$;EEVL;Vq1M`wR|*pw``5rxq9ubjYenp9&fl-HTy zViD{;ns6y8uUfpzLFi03+9i)heuIV+4K7qU^pNsuUn})B2v}D}gIwb$xD} z3hFWK*DAU*IIjTP!BhFFv>MgNWkB=HEZ6u5yL!rXH?52uQvR_02ARCa zdYyw1e#X?H&BAMC48s4tI}&Me=XBkV{KERkjb9XiQXkmqF`r~;sgbbedQq!4ebbuW&PcY=>lUn@6AZlZUjm?@(lF%>1^V3AFcmb2A-z@xX9dj2+<( zrF^Vg8Y|f6^$!knf)Wl9vBO+jr69j}M^cWdtW(i!;HQ!|G)QBm>@J4JuckNM^4mlG z%+Xj6u6p`q@0MHJyd!Ug*cTEZyLp$IyME@+D6E}3%q*9}9h0!w$A4BK*V`q+ zAsgU_re-VFtIdAaMuJ?VnS|U2L_&jW%F?xr8)r*-#zO^^l`;Au9uSa?7Gnd?0z$I;tNgOUq4yK)uL4qw_tlOKDk16*;VMAfYKJpAqYPVJ~!lQBmXP@HC z%bYZRk38DY$bX>rA={iyGZi?D#Grod72X)0u-dQjzNcbxEPIa8s9;TnhiF1o$N>)^ zn*ZF@S_<%Ph?%M_A<(C-P+YhvGKW-(K}E?XBon%m*?de<*!niKV~=6JSco|~ZDiJ8 zIALJbR7s?m{9>eHUivduLqt@cVq)KycLtN|DJckCKX6hFb3vlc**C?&)1uSM=+wL~ zg>*}p>Zh`g1nG|?2Xo?2BUe|uM%#W2zZZ(aR7Nj^>BsU|3%S%W>06Go z2v8pb;g}An&|5m)L@e%M9h|_u)~{Zf%B#79YMQEDvB|(yd7Wrnfil5nu2x#6>_m1@ zQA)iC(~sd5`;#&wH&ccmdfp zWoP^F$zHB~;!!rcx-SRKwdNACERyY&#utscN%V1n@&WxL6r3Tosdi87^tGgo3gr-} zOL`uK%cDTWJEGv)xH1USZQ93zr}(Myd?hRyn4(+V{g6{8?6USMEg2w3{vCj9C|TdN zYIHzq53b)*YpwwX-@rKcqI1kdHHaXEv!QA`YH5k&lGEQqT_O}&j6Q}9t*!JNxl^&-WQYIC4N&dp`mhH}8sjIyU z53Wri%7s2=NgCDcR6Yp}0%=Zy?Ue98dl?0Fx9iie%F5H*o9d070L`~Vh%__=-?q`L z6AxorHg@M^JgArQu|t5K(K4!2aaw*0D%8U`XsyI>q1KSsn}W)dHU;>q6ctmt=S(eh z*K#xSQF$o^&2%$2`I0v{akvf4Pw>9G%Q&KrUmG&DIm~28Izv@5XicO~hm@iSp!$}H z-}%@tnv$Df_3oG^7A_4X9Yn5L(ml95HY8QmCY)Qa7c^+9`QTOR(~*sZ=Lp&QA)=_N z?lV#_3rCD(i`+NMyc3HZ*SoAYChe9(ee-Op=@@Aw988xiSkG__w?wR)AaC`9Pbgy_4-{P&HZb=;S+V{Nz5KR{N?crjFD0?-h`1I{!OUSU{**3{c zKv|PKBNEBE#2Aq!K{~^f%&wn`JNLEv zAi@iJ6QbQnE(=)SKB6H1kY}gaTRrO~Stx{n0M->Lf5#YurrgyXSVhi1ONVk>NrG2E z1}mtFKyP$kWd$Na(?2PV7E5ySbn~=h1}8R$nyj$frrr^uxa7q>ACtw9WpiqKXs9pO zZYsF-Uj8!ZQ{zq0TeRk53zFNpSoI#F;hI*x}9`6$BOS&>@1ecK-@yO5l*N86QQAPK3jzJy>2NT zo9MF?Q(Vp{m>4eV#FMwYARk*hX4KQ2ypt7JST@e87yA=3JC|O6afaN#wW&dt@@7&; z)!$1ht%igB5sNPNW5*{t5}dH8ooB}a^Vtoj3D7zk6OC#^f|q%<8OAXe&7fuIdN*pfL0&(K4^ZYOJh3N&OU%z*!W^t# zOo!2yUWj)laG7~izDx322j%*nl4OE<0pBuzdVS$sr=nL={+jps-s{jZpO&pf>G?_& zYergX5?7MFVZk@AakJ>JhV42p>TxFYsXHykG<03 zS&Y8wd~M9cHV?%$l;15Dhe+?3kIt&avSm$&SfMzTsw~pZM(Y}VFh*F! z>fSz$6;0eVZ^P!mu+r%K-Wpcnk7xG)kV~+0qQoTgUQ!~@N@0dctDoja5@bGX&SCy; z|5Iy^`*({q&g?_+@rQRInfW5Cb&+h}G-YJsg8ibFB*&J3$7%*s5tSF-$9^7gwTBID zf!;04sIzpWoh&hPY#ukXT|7Q;X+v%#_e{bk>z>x$n}=0rRdRup^8zu}oi*>v>#x;E zh6TF5C3wICag6G6L@9pMaTdgU@y5HH+`O5fN`!^cE}cEuKk-#~VnyWz0APe66cz8Q zD=PkLs~EjOoD+~Jqtcxr4NJSnn(%qPnCPo9)^XQ## zjmM|eng`!&0(7t6xjTC)vm6GrQg!Q>=1}Q1Y?GI1snCacP22Edtzee2jA^js}l{*)SX~p z0tI3#y$p`|9$&VNk$$ghC7Ct5;Vuq>ppR`YP-Qs<57#C5TGZ9$2Qo(%V4C&d99KdD zTSYUaW9M+EbEoZUVKQ%-Y{|&O(ao>IAHAjThd^)Ln`moE*|<9MLv3BHVf;SMZs@Ij z06<#K#|>)Z2txs_VRi@?8MfV5Z`gncTNyTEQEfqOH$|8|Le0+uX5gn|XyfN-BWcSf zCrc>pBZVe#hM}N9A7>{Qq?C^g+izYe^!2Y|0XE=o2+C20%|!b?P|?)`1{C2J;THrc z`yjl8*klQT(jK;ODSaiCKPk|6GHmuJl$(@*fVa0dzqc^ItB0KcSW;3_Ku}0PNC<>R zfRMf}D5wv}1fBWUw~^ZpI}uh@Ts(I{g8xFL?t(-?U2I^#sLNKu{qGK@eO>P}tU5%tpdSMB*eVkQTQrr8t*AI$7;P&A z1KWT^1VzL^P^hR42qq3jGeO}(P_XrHDq9;V6;}^uD7rfl&QLp;fSZfm?}}f7OF{0d z%diRY3;w6%z7rG$M;pknX+v#*x(5HLF+@1S3{cQta)QOgBqasK#lc`9QE?$5@&AB~ zU>-&o7f}&D_f5E%jBH+INH}tR31C;)w z&(#n}bo;))i~bl=1~B(O?*6!SLi`>}K;Z9DAqBPhBLpPW3ugPWGwR$L4O78Hh|bHP>|omhglAYl<}n1qm|gtfJe*x%Wau5gq$ z)B^^wL+gmv3Z0+7wE}Yg(NjEshkM(@esu#{F%Vb?^gk67_%mXGU$e%)LY5ZzAEHSA z2K;53LEHUNhMvCAv!TGhr^7!*`!(_We|-Jf8UG(!KvVzI$bY5pKXUye*MFtJe+B+0 zyZ({uzf$180{@d;|Ig$i{Lg|4=7Rnju26j6p_5WH`t^_gkng8+7!j($(mWw5@z|!3ev>5K($kMu*e>mRf-;AC6U7{nkz7=lkn#w zWv5c)>V2CJp{F?eWL=YyR~ebdxKSPPMfJuFujiL+;UhWzyKUaYy)tPaHY_Qk zvVOuF_9iBj)=fpX&EzJ3bixgz&UThGWd5+ z04KR(gd71--1rf$US(dK><92yW`(v$jOg#YdKayqxeSoUQ&Z+kT>Ds0S-+(`xF-f# zS-!0GPsUz?Y!$722nK}tk0)5&5dkIvocws=qA4Pl{gPSBiHPDV4m)Zw*5Y>q ziNd2^O4{ak0qd36KD$DEG(z7XM_4w{VhmPr3CpFrB>7m!eg`YrME~TYlB8`r^Gm~A z>;C#fSA|?E0IG6ozZ6~%k;gyYk1Vy0@^>vVaV}xQ302~WC13_X#K#dD))gkswnaUd zEic_zd@z^*pfqwoO;oqlNAuU83Av~+huz<>A*l&P!aFabV|4-MTzbI$D2>?I+tuT} z&#`u*Dc@S;mLCx3lUNe*(UK$W-^Bem0kVXELws^&$vJwmpK4_LKwKv_tm;$SBqCesBj^W2$hfH;PpOrvqEJ{+N&tH`iX8ix zyN-)Vo1DRIqV(cT^_$n?)^fX7a|Q@A{62ERFVWKxp8XCSuP_zyO-i;1J68(Tmjf&1 zK%uaTrasLd2iuiRBy5_Wg>r@y?P+RN0wYUMH73p?>ZIZA5ZctMO>7P$*BsiX98rPi zn-M?6ydKUZknGxfk6v}Ar91O!Y@zx~P!4o;>)yL{m=zcmCVk`ZR!mOKMXvBHh_+2s zf%lW`V!4k76gXpG?^veWA&qw?)5@&~yoBbUA83ORYP0BGl)V*uR(V7j6tcsQd$%H^ zU?845_3KebTn+Af{dA001x!Zya;u}ITtFi5MMkzUi5*4M2u%<>M;=fqo(Lj*m6<2( z{&~dD)i*FGS)o-vxtTu`7Rk3bCjmM{P`@~S+p>JN;K&2uA+tCkOAdO(2n(|^Qs8=B z!=CF+hz`d)^%LAk>?ME$IDQ_udi=b32o0yCw11h~C+E*~Wf^sJ&OTw!!u(JgIrgb# z((_QMouGj3;9bG)9dB_ip8J@BJASjPM;#>Q_u7T!(Nu>3%D@*iiI$1Zr74g`8L5azunVP#@vrI#K&eg_ft|glo_=zk9Wo%HAV3 z$Y5v{f^_a(}>xNNlaZ8aIaf z{M=anKwoiQ-M+G)pjJZMLAJ6t<4QX1m)kSo{W1C3yH?`4_WeK~&c_AIR$YnHYu)UC z;@L@g!I2ma-mG`u=K}-1ZHGW3mOB*%PdFu$;Mlt<2mN8g#nCV7u6>gR_~%?0rOPji zachT|=AB5H`Gn`;heM)a7YjA&dfr65xY(nbr6=a}yYLeVTKI`p!aT>+u7GrXiJ5qX z>eB$6h!YTOg`AP}1z$)#~TtM&#y4y@1gzf4>xSXMDORwE2ok zm{Fb=SXC$|IBp7zEqJA|lh;2hDhOD4e`=N2CAwC?Yf{1EkIm-Kd9SrO+iLrKSAOV5 zMmv~Wku7xO5r%+ffyY_g5;9H(wlSb9{OgDUwai+_{Oe>1yI@&)H@wp=C`pTcECSS( Lb(EefScUu_39i@= diff --git a/src/languages.ts b/src/languages.ts deleted file mode 100644 index 0b73f8287..000000000 --- a/src/languages.ts +++ /dev/null @@ -1,235 +0,0 @@ -type IndentStyle = 'space' | 'tab'; - -interface IPrismSettings { - cli?: { - 'data-filter-output'?: string; - 'data-host'?: string; - 'data-user'?: string; - }; - importScript?: boolean; - whitespace: { - indentSize: number; - indentStyle: 'space' | 'tab'; - }; -} - -export interface ILanguage { - id: string; - label: string; - prismSettings: IPrismSettings; -} - -export const languages: ILanguage[] = [ - { - id: '*', - label: '*', - prismSettings: { - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'bash', - label: 'Bash', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'css', - label: 'CSS', - prismSettings: { - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'curl', - label: 'Curl', - prismSettings: { - cli: { - 'data-filter-output': '> ', - 'data-host': 'maxmind', - 'data-user': 'docs', - }, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'cli', - label: 'CLI', - prismSettings: { - cli: { - 'data-filter-output': ' >', - }, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'c', - label: 'C', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'csharp', - label: 'C#', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 4, - indentStyle: 'tab' as IndentStyle, - }, - }, - }, - { - id: 'csv', - label: 'CSV', - prismSettings: { - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'go', - label: 'Go', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'tab' as IndentStyle, - }, - }, - }, - { - id: 'java', - label: 'Java', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'javascript', - label: 'Node', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'json', - label: 'JSON', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'markdown', - label: 'Markdown', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'perl', - label: 'Perl', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 4, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'php', - label: 'PHP', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 4, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'python', - label: 'Python', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 4, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'ruby', - label: 'Ruby', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'sql', - label: 'Sql', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, - { - id: 'typescript', - label: 'TypeScript', - prismSettings: { - importScript: true, - whitespace: { - indentSize: 2, - indentStyle: 'space' as IndentStyle, - }, - }, - }, -]; diff --git a/src/pages/search-results.module.scss b/src/pages/search-results.module.scss deleted file mode 100644 index 0b2b425be..000000000 --- a/src/pages/search-results.module.scss +++ /dev/null @@ -1,91 +0,0 @@ -@use '../styles/variables'; - -.loading { - align-items: center; - display: flex; - height: 50vh; - justify-content: center; -} - -.wrapper { - margin: 0 var(--mm-spacing); - max-width: 960px; - min-height: 500px; -} - -.header { - margin-bottom: calc(var(--mm-spacing) / 2); -} - -.heading { - font-size: 20px; - margin: 0; - - strong { - font-weight: bold; - } -} - -@include variables.breakpoint('lg') { - .heading { - font-size: 30px; - } -} - -.query { - font-weight: bold; -} - -.count { - font-size: 14px; -} - -.results { - margin-bottom: var(--mm-spacing); -} - -.result { - margin-bottom: calc(var(--mm-spacing) / 1.5); -} - -.pagination { - margin-bottom: var(--mm-spacing); - - &::after { - clear: both; - content: ''; - display: table; - } -} - -.spellingLink, -.previous, -.next { - border-bottom: 2px dotted var(--mm-color-display-text); - color: var(--mm-color-display-text); - text-decoration: none; -} - -.previous { - float: left; - - &::before { - content: '<'; - margin-right: 5px; - } -} - -.next { - float: right; - - &::after { - content: '>'; - margin-left: 5px; - } -} - -.spellingLink:hover, -.previous:hover, -.next:hover { - border-bottom-style: solid; -} diff --git a/src/pages/search-results.tsx b/src/pages/search-results.tsx deleted file mode 100644 index fac04d96e..000000000 --- a/src/pages/search-results.tsx +++ /dev/null @@ -1,261 +0,0 @@ -/* eslint-disable react/prop-types */ - -import { globalHistory } from '@reach/router'; -import { RouteUpdateArgs } from 'gatsby'; -import React, { useEffect, useState } from 'react'; - -import Layout from '../components/Layout/Layout'; -import Link from '../components/Link'; -import Loading from '../components/Loading'; -import H1 from '../components/Mdx/H1'; -import SearchResult from '../components/SearchResult'; -import GoogleSearch, { ISearchResults } from '../services/GoogleSearch'; - -import * as styles from './search-results.module.scss'; - -type queryValue = number | string | undefined; - -const SearchResultsPage: React.FC = (props) => { - const urlParams = new URLSearchParams(props.location.search); - - const getQueryUrl = (param: string, q: queryValue): string => { - if (!q) { - return ''; - } - - const urlParams = new URLSearchParams(props.location.search); - urlParams.set(param, q.toString()); - - return `${props.uri}?${urlParams.toString()}`; - }; - - const [ - query, - setQuery, - ] = useState(urlParams.get('q') as string); - - const [ - startIndex, - setStartIndex, - ] = useState(urlParams.get('start') as string); - - const [ - results, - setResults, - ] = useState({} as ISearchResults); - - const [ - isLoading, - setIsLoading, - ] = useState(true); - - const [ - hasError, - setHasError, - ] = useState(false); - - useEffect(() => { - globalHistory.listen((history) => { - const historyParams = new URLSearchParams(history.location.search); - setQuery(historyParams.get('q') as string); - setStartIndex(historyParams.get('start') as string); - props.location.search = history.location.search; - }); - }); - - useEffect(() => { - const fetchResults = async () => { - window.scrollTo(0,0); - try { - setHasError(false); - setIsLoading(true); - setResults(await GoogleSearch(query, startIndex)); - } catch { - setHasError(true); - } - setIsLoading(false); - }; - - if (query) { - fetchResults(); - } - }, [ - query, - startIndex, - ]); - - - return ( - - { - // Loading - isLoading && query && -
    - -
    - } - - { - // No Query - !query && -
    -
    -

    - Please enter a search query -

    -
    -
    - } - - { - // There's a server error - hasError && -
    -
    -

    - There was an issue performing the search. -

    -

    - Please try again. -

    -
    -
    - } - - { - // There's no search results - !isLoading && !hasError && !results.items && query && -
    -
    -

    - No results found for - {' '} - {query} -

    - { results.spelling && -

    - Try searching for - {' '} - - {results.spelling?.correctedQuery} - -

    - } -
    -
    - - } - - { - // We found stuff - !isLoading && results.items && query && -
    -
    - <> -

    - Search results for - {' '} - - {query} - -

    - - Displaying results - {' '} - {results.queries.request[0].startIndex} - - - {results.queries.request[0].startIndex - + results.queries.request[0].count - - 1} - {' '} - of - {' '} - {results.queries.request[0].totalResults} - - -
    -
    - { - results.items?.map((result) => { - return ( - - ); - }) - } -
    - -
    - } -
    - );}; - -export default SearchResultsPage; diff --git a/src/services/GoogleSearch.ts b/src/services/GoogleSearch.ts deleted file mode 100644 index 98e998090..000000000 --- a/src/services/GoogleSearch.ts +++ /dev/null @@ -1,53 +0,0 @@ -interface IItems { - cacheId: string; - htmlSnippet: string; - htmlTitle: string; - link: string; -} - -interface IQuery { - count: number; - startIndex: number; - totalResults: string; -} - -export interface ISearchResults { - items?: IItems[]; - queries: { - nextPage?: IQuery[]; - previousPage?: IQuery[]; - request: IQuery[]; - } - spelling?: { - correctedQuery: string; - } -} - -const endpoint = - 'https://www.googleapis.com/customsearch/v1/siterestrict?cx={cx}&key={key}'; - -const cx = 'cde039a7678700a13'; -const key = 'AIzaSyAI4atAz3I5ujXCjoEXRvdwqcYn3AIsCA8'; - -const url = endpoint - .replace('{cx}', cx) - .replace('{key}', key); - - -const GoogleSearch = - async (query: string, startIndex: string | null): Promise => { - let requestUrl = `${url}&q=${query}`; - - if (startIndex) { - requestUrl = requestUrl + `&start=${startIndex}`; - } - const response = await fetch(requestUrl); - - if (!response.ok) { - throw new Error(`There was an error searching for ${query}`); - } - - return await response.json() as ISearchResults; - }; - -export default GoogleSearch; diff --git a/src/store/index.tsx b/src/store/index.tsx deleted file mode 100644 index b7dd0ce20..000000000 --- a/src/store/index.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; - -interface IContext { - selectedLanguage: string; -} - -interface IAction { - payload: string; - type: 'change_language' | undefined; -} - -let initialContext: IContext; -if (typeof window !== 'undefined') { - initialContext = { - selectedLanguage: window.localStorage.getItem('mm-selected-language') || '', - }; -} else { - initialContext = { - selectedLanguage: '', - }; -} - -const reducer = (context: IContext, action: IAction): IContext => { - switch (action.type) { - case 'change_language': - window.localStorage.setItem('mm-selected-language', action.payload); - return { - ...context, - selectedLanguage: action.payload, - }; - default: - return context; - } -}; - -export const Store = - React.createContext< - { - context: IContext; - dispatch: React.Dispatch; - }>({ - context: initialContext, - dispatch: () => null, - }); - -export const StoreProvider: React.FC = (props) => { - const [ - context, - dispatch, - ] = React.useReducer(reducer, initialContext); - - return ( - - {props.children} - - ); -}; diff --git a/src/styles/_reset.scss b/src/styles/_reset.scss deleted file mode 100644 index f8fedd640..000000000 --- a/src/styles/_reset.scss +++ /dev/null @@ -1,136 +0,0 @@ -/* stylelint-disable */ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -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, -img, -ins, -kbd, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -b, -u, -i, -center, -dl, -dt, -dd, -ol, -ul, -li, -fieldset, -form, -label, -legend, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td, -article, -aside, -canvas, -details, -embed, -figure, -figcaption, -footer, -header, -hgroup, -menu, -nav, -output, -ruby, -section, -summary, -time, -mark, -audio, -video { - border: 0; - font: inherit; - font-size: 100%; - margin: 0; - padding: 0; - vertical-align: baseline; -} - -/* HTML5 display-role reset for older browsers */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -menu, -nav, -section { - display: block; -} - -body { - line-height: 1; -} - -ol, -ul { - list-style: none; -} - -blockquote, -q { - quotes: none; -} - -blockquote::before, -blockquote::after, -q::before, -q::after { - content: ''; - content: none; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss deleted file mode 100644 index 1cae19e91..000000000 --- a/src/styles/_variables.scss +++ /dev/null @@ -1,198 +0,0 @@ -$breakpoints: ( - xs: 360px, - sm: 576px, - md: 768px, - lg: 992px, - xl: 1200px, - xxl: 1400px, - xxxl: 1660px -); - -@mixin breakpoint($size) { - $width: map-get($breakpoints, $size); - - @media only screen and (min-width: $width) { - @content; - } -} - -@mixin max-breakpoint($size) { - $width: map-get($breakpoints, $size); - - @media only screen and (max-width: $width) { - @content; - } -} - -$containers: ( - sm: 540px, - md: 720px, - lg: 960px, - xl: 1140px, - xxl: 1320px, - xxxl: 1600px -); - -@mixin container($size) { - $width: map-get($containers, $size); - max-width: $width; - padding: 0; -} - -@mixin max-width { - @include breakpoint('xl') { - max-width: 880px; - width: 100%; - } -} - -@mixin heading { - color: #00374c; - font-family: var(--mm-font-stack-display); - font-weight: 500; - line-height: 1.2em; - margin: calc(var(--mm-spacing) * 2) 0 calc(var(--mm-spacing) / 4); - position: relative; - scroll-margin-top: calc(var(--page-header-height) + var(--mm-spacing)); - - + [id^='toc-'] { - h3, - h4, - h5, - h6 { - margin-top: calc(var(--mm-spacing) / 4); - } - } - - + [class^='Table-module'] { - margin-top: calc(var(--mm-spacing) / 4); - } - - .link { - color: #00374c; - text-decoration: none; - } - - .icon { - font-size: 12px; - left: -5px; - margin-bottom: 0 !important; - opacity: 0.2; - position: absolute; - top: 50%; - transform: translate(-100%, -50%); - transition: all 0.15s ease-out; - } - - .link:hover .icon { - font-size: 14px; - opacity: 0.75; - } -} - -@mixin scrollbars($scroll-color: rgba(255, 255, 255, 0.2)) { - scrollbar-color: $scroll-color transparent; - scrollbar-width: thin; - - &::-webkit-scrollbar { - height: var(--mm-border-radius); - width: var(--mm-border-radius); - } - - &::-webkit-scrollbar-thumb { - background-color: $scroll-color; - border-radius: var(--mm-border-radius); - } - - &::-webkit-scrollbar-corner { - background: transparent; - } -} - -$pattern-scale: 1; - -@mixin pattern-base { - background-color: #00a7e5; - background-image: url('/static/svg/bg-pattern.svg'); - background-position: center center; - background-size: (80px * $pattern-scale) (140px * $pattern-scale); - content: ' '; - height: 100%; - left: 0; - position: absolute; - top: 0; - transform: translateZ(0); - width: 100%; - will-change: transform; /* stylelint-disable-line */ -} - -@mixin pattern-gradient { - background: rgb(0, 119, 194); - background: linear-gradient(90deg, rgba(0, 119, 194, 0.5) 0%, var(--page-type-color)); - content: ' '; - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; -} - -@mixin pattern { - position: relative; - - &::before { - @include pattern-base; - } - - &::after { - @include pattern-gradient; - } -} - -@mixin pattern-border { - &::before, - &::after { - display: block; - height: 10px !important; - overflow: hidden; - } - - &::before { - @include pattern-base; - } - - &::after { - @include pattern-gradient; - } -} - -@mixin menu-button { - background: var(--mm-color-background); - border: 1px solid var(--mm-color-border); - border-radius: var(--mm-border-radius); - box-sizing: border-box; - color: var(--mm-color-primary-color); - cursor: pointer; - font-size: 12px; - height: 30px; - min-width: 30px; - padding: 0; - width: 30px; - - &:hover { - background-color: var(--mm-color-sidebar); - } - - @media only screen and (min-width: 420px) { - font-size: 16px; - height: 50px; - min-width: 50px; - width: 50px; - } -} - - -@mixin opaque-overlay { - backdrop-filter: blur(3px); - background-color: rgba(255, 255, 255, 0.7); -} diff --git a/src/styles/global.scss b/src/styles/global.scss deleted file mode 100644 index 3e9950b45..000000000 --- a/src/styles/global.scss +++ /dev/null @@ -1,91 +0,0 @@ -@use './reset'; - -/* stylelint-disable no-invalid-position-at-import-rule */ -@import '~normalize.css/normalize.css'; -@import '~@fontsource/montserrat/500.css'; -@import '~@fontsource/montserrat/700.css'; -@import '~@fontsource/montserrat/900.css'; -@import '~@fontsource/roboto/500.css'; -@import '~@fontsource/roboto/700.css'; -@import '~@fontsource/source-code-pro/500.css'; -@import '~@fontsource/source-code-pro/700.css'; -/* stylelint-enable no-invalid-position-at-import-rule */ - -:host { - --gatsby: #274958; -} - -:root { - --gatsby: #274958; - --mm-color-active-blue: #2b7ec6; - --mm-color-background: #fff; - --mm-color-background-code: #274958; - --mm-color-sidebar: #f5f6f7; - --mm-color-border: #ddd; - --mm-color-logo-blue-light: #00aeef; - --mm-color-logo-blue-dark: #005f83; - --mm-color-primary-text: #595959; - --mm-color-display-text: #005f83; - --mm-border-radius: 6px; - --mm-font-stack-default: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Ubuntu, sans-serif; - --mm-font-stack-display: 'montserrat', var(--mm-font-stack-default); - --mm-font-stack-monospace: 'Source Code Pro', monospace; - --mm-layout-toc-width: 290px; - --mm-layout-sidebar-width: 350px; - --mm-outline: 2px solid var(--mm-color-logo-blue-light); - --mm-spacing: 40px; - --page-header-height: 80px; - --page-type-color: rgba(255, 255, 255, 0.3); -} - -:global(.fa-icon) { - vertical-align: middle; -} - -:global(#___gatsby) { - min-height: 100vh; -} - -:global(#gatsby-focus-wrapper) { - display: flex; - flex-direction: column; - min-height: 100vh; -} - -/* Not sure why .page-type--minfraud does not work here */ -[class='page-type--minfraud'] { - --page-type-color: rgba(255, 0, 136, 0.5); -} - -/* Not sure why .page-type--geoip does not work here */ -[class='page-type--geoip'] { - --page-type-color: rgba(0, 255, 102, 0.5); -} - -html { - min-width: 360px; -} - -body { - color: var(--mm-color-primary-text); - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Ubuntu, sans-serif; - font-size: 1.1rem; - line-height: 1.3em; - min-height: 100vh; - min-width: 360px; - position: relative; -} - -* { - box-sizing: border-box; -} - -*:focus { - outline-color: var(--mm-color-logo-blue-light); - outline-style: solid; - outline-width: 2px; -} - -[class='geoip-icon-st0'] { - fill: none; -} diff --git a/src/templates/Home/Home.module.scss b/src/templates/Home/Home.module.scss deleted file mode 100644 index 4390cbe75..000000000 --- a/src/templates/Home/Home.module.scss +++ /dev/null @@ -1,76 +0,0 @@ -@use '../../styles/variables'; - -.layout [class^='Layout-module--content'] { - --mm-spacing: 20px; - background-color: var(--mm-color-sidebar); - display: grid; - grid-auto-rows: minmax(min-content, max-content); - justify-items: center; -} - -.callout { - padding: var(--mm-spacing) var(--mm-spacing) 0; - text-align: center; -} - -.calloutHeading { - font-family: var(--mm-font-stack-display); - font-size: 20px; - font-weight: 700; - line-height: 1.2em; - margin-bottom: calc(var(--mm-spacing) / 2); -} - -.noWrap { - white-space: nowrap; -} - -.calloutSubheading { - font-family: var(--mm-font-stack-monospace); - font-size: 14px; - font-weight: 700; -} - -.products { - display: grid; - gap: var(--mm-spacing); - padding: var(--mm-spacing); -} - -.signUp { - padding: 0 var(--mm-spacing) var(--mm-spacing) var(--mm-spacing); - - h3 { - font-size: 16px !important; - } - - svg { - width: 25px !important; - } - - > * { - --page-type-color: rgba(0, 255, 102, 0.5); - } -} - - -@include variables.breakpoint('md') { - .layout [class^='Layout-module--content'] { - --mm-spacing: 40px; - background-color: var(--mm-color-sidebar); - } - - .calloutHeading { - font-size: 35px; - } - - .calloutSubheading { - font-size: 20px; - } - - .products { - gap: var(--mm-spacing); - grid-template-columns: repeat(2, minmax(0, 600px)); - justify-content: center; - } -} diff --git a/src/templates/Home/Home.tsx b/src/templates/Home/Home.tsx deleted file mode 100644 index e89cee3dc..000000000 --- a/src/templates/Home/Home.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import { - FaBookOpen as ViewDocsIcon, - FaRocket as QuickstartIcon, - FaUserCheck as SignUpIcon, -} from 'react-icons/fa'; - -import Layout from '../../components/Layout/Layout'; -import LinkButton from '../../components/LinkButton'; -import { - a as A, - LinkGroupCard, -} from '../../components/Mdx'; -import Product from './Product'; -import { IHomeContext } from './query'; - -import * as styles from './Home.module.scss'; - -interface IHome { - pageContext: IHomeContext; -} - -const Home: React.FC = (props) => { - const { pageContext } = props; - const { frontmatter } = pageContext; - const { description, keywords, title } = frontmatter; - - return ( - -
    -

    - - 👋 - - {' '} - Welcome to the - {' '} - - MaxMind Developer Portal - - ! -

    -

    - Develop applications using industry-leading - {' '} - - IP intelligence and risk scoring. - -

    -
    -
    - - Learn more about - {' '} - - minFraud Web Services - - . - - )} - heading="minFraud Web Services" - icon="MinFraudIcon" - links={( - <> - - - - )} - subheading="Transaction Risk API" - > - Use risk scoring and data to identify high-risk activity in - e-commerce payments, platform user activity, incentivized traffic, - and more. - - - Learn more about - {' '} - - GeoIP2 - - {' '} - and - {' '} - - GeoLite2 - - . - - )} - heading="GeoIP2 and GeoLite2" - icon="GeoIPIcon" - links={( - <> - - - - )} - subheading="Databases and Web Services" - > - Use GeoIP intelligence for content customization, advertising, - digital rights management, compliance, fraud detection, security and - more. - -
    -
    - -
    -
    - ); -}; - -Home.propTypes = { - pageContext: PropTypes.any, -}; - -export default Home; diff --git a/src/templates/Home/Product.module.scss b/src/templates/Home/Product.module.scss deleted file mode 100644 index 994230ce8..000000000 --- a/src/templates/Home/Product.module.scss +++ /dev/null @@ -1,211 +0,0 @@ -@use '../../styles/variables'; - -.container { - --mm-spacing: 20px; - background-color: var(--mm-color-background); - border-radius: var(--mm-border-radius); - box-shadow: rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px; - display: grid; - grid-template-rows: max-content auto max-content max-content; - overflow: hidden; - position: relative; -} - -.container__geoip { - --page-type-color: rgba(0, 255, 102, 0.5); -} - -.container__minfraud { - --page-type-color: rgba(255, 0, 136, 0.5); -} - -.header { - padding: var(--mm-spacing); - @include variables.pattern; -} - -.lockup { - --mm-overview-heading-drop-shadow: 1px 3px 0 rgba(0, 0, 0, 0.25); - display: grid; - grid-auto-flow: column; - grid-template-areas: - 'logo' - 'heading' - 'subheading'; - position: relative; - z-index: 1; -} - -.lockup > * { - align-self: center; - justify-self: center; -} - -.icon { - grid-area: logo; - height: 90px; - margin-bottom: var(--mm-spacing); - width: 90px; -} - -.heading { - color: #fff; - font-family: var(--mm-font-stack-display); - font-size: 20px; - font-weight: 700; - grid-area: heading; - line-height: 1em; - margin-bottom: 5px; - text-align: center; - text-shadow: var(--mm-overview-heading-drop-shadow); -} - -.subheading { - color: #fff; - font-family: var(--mm-font-stack-display); - font-size: 16px; - font-weight: 700; - grid-area: subheading; - line-height: 1em; - text-align: center; - text-shadow: var(--mm-overview-heading-drop-shadow); -} - -.content { - background-color: var(--mm-color-background); - font-size: 14px; - padding: var(--mm-spacing); - text-align: center; -} - -.content * { - font-size: 14px; -} - -.links { - background-color: var(--mm-color-sidebar); - border-top: 1px solid var(--mm-color-border); - display: grid; - gap: var(--mm-spacing); - grid-auto-flow: column; - grid-template-columns: repeat(2, max-content); - justify-content: center; - padding: var(--mm-spacing); - width: 100%; -} - -.footer { - background-color: #f0f8ff; - border-top: 1px solid #cfdee8; - display: grid; - gap: calc(var(--mm-spacing) / 4); - grid-auto-flow: column; - grid-template-columns: max-content max-content; - grid-template-rows: max-content; - justify-content: center; - padding: calc(var(--mm-spacing) / 2); - text-align: center; -} - -.footer * { - align-self: center; - font-size: 12px; -} - -.infoIcon { - color: var(--mm-color-active-blue); - font-size: 16px; -} - -.learnMore { - color: #545454; - margin: 0; -} - -.learnMore [class^='A-module'] { - color: #005270; - font-weight: 600; -} - -.links > * { - justify-self: center; -} - -.content > *:first-child { - margin-top: 0; -} - -.content > *:last-child { - margin-bottom: 0; -} - -@include variables.breakpoint('xl') { - .container { - --mm-spacing: 40px; - display: grid; - grid-template-areas: - 'header header' - 'content links' - 'learnMore learnMore'; - } - - .header { - --mm-spacing: 40px; - display: grid; - grid-area: header; - justify-content: center; - } - - .lockup { - column-gap: calc(var(--mm-spacing) / 2); - grid-template-areas: - 'logo heading' - 'logo subheading'; - grid-template-columns: max-content max-content; - } - - .lockup > * { - justify-self: left; - } - - .icon { - margin-bottom: 0; - } - - .heading { - align-self: end; - font-size: 24px; - } - - .subheading { - align-self: start; - font-size: 18px; - } - - .content { - grid-area: content; - text-align: left; - } - - .content * { - font-size: initial; - } - - .links { - border-left: 1px solid var(--mm-color-border); - border-top: 0; - display: grid; - gap: calc(var(--mm-spacing) / 2); - grid-area: links; - grid-template-columns: auto; - grid-template-rows: max-content max-content; - } - - .links > * { - justify-self: auto; - } - - .footer { - grid-area: learnMore; - } -} diff --git a/src/templates/Home/Product.tsx b/src/templates/Home/Product.tsx deleted file mode 100644 index cad7de875..000000000 --- a/src/templates/Home/Product.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import * as React from 'react'; -import { FaInfoCircle as InfoIcon } from 'react-icons/fa'; - -import { p as P } from '../../components/Mdx'; -import ProductIcon from '../../components/ProductIcon'; - -import * as styles from './Product.module.scss'; - -interface IProduct { - children: React.ReactNode; - family: ProductFamily; - footer: React.ReactNode, - heading: string; - icon: string; - links: React.ReactNode, - subheading: string; -} - -const Product: React.FC = (props) => { - const { - children, - family, - icon, - heading, - footer, - links, - subheading, - } = props; - - return ( -
    -
    -
    - -

    - {heading} -

    -

    - {subheading} -

    -
    -
    -
    -

    {children}

    -
    -
    - {links} -
    -
    - -

    - {footer} -

    -
    -
    - ); -}; - -Product.propTypes = { - children: PropTypes.node.isRequired, - family: PropTypes.oneOf([ - 'minfraud', - 'geoip', - ] as const).isRequired, - footer: PropTypes.node.isRequired, - heading: PropTypes.string.isRequired, - icon: PropTypes.string.isRequired, - links: PropTypes.node.isRequired, - subheading: PropTypes.string.isRequired, -}; - -export default Product; diff --git a/src/templates/Home/index.ts b/src/templates/Home/index.ts deleted file mode 100644 index 30c358a55..000000000 --- a/src/templates/Home/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as default } from './Home'; diff --git a/src/templates/Home/query.ts b/src/templates/Home/query.ts deleted file mode 100644 index dac36d2b3..000000000 --- a/src/templates/Home/query.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import { BaseQuery, IBaseQuery } from '../../baseQuery'; - -export type IHomeContext = Pick; - -const query: QueryFn = ( - graphql: GraphqlFn -) => graphql(` - ${BaseQuery} - - query PageTemplateQuery { - allMdx(filter: {fields: {layout: {eq: "home"}}}) { - nodes { - ... BaseQuery - } - } - } -`); - -export default query; diff --git a/src/templates/Overview/Overview.module.scss b/src/templates/Overview/Overview.module.scss deleted file mode 100644 index 8a7ea15b2..000000000 --- a/src/templates/Overview/Overview.module.scss +++ /dev/null @@ -1,121 +0,0 @@ -@use '../../styles/variables'; - -.header { - --mm-overview-heading-drop-shadow: 2px 4px 0 rgba(0, 0, 0, 0.25); - @include variables.pattern; - display: grid; - padding: var(--mm-spacing); - - > * { - position: relative; - z-index: 2; - } - - &::before { - background-attachment: fixed; - } -} - -.lockup { - column-gap: 20px; - display: grid; - grid-template-areas: - 'logo' - 'heading' - 'subheading'; - grid-template-columns: auto auto; - justify-self: center; - row-gap: 10px; -} - -.lockup > * { - align-self: center; - justify-self: center; -} - -.icon { - grid-area: logo; - margin-bottom: 25px; -} - -.heading { - color: #fff; - font-family: var(--mm-font-stack-display); - font-size: 30px; - font-weight: 700; - grid-area: heading; - line-height: 1em; - text-align: center; - text-shadow: var(--mm-overview-heading-drop-shadow); -} - -.subheading { - color: #fff; - font-family: var(--mm-font-stack-display); - font-size: 18px; - font-weight: 700; - grid-area: subheading; - line-height: 1em; - text-align: center; - text-shadow: var(--mm-overview-heading-drop-shadow); -} - -.content { - padding: var(--mm-spacing); -} - -.content > *:first-child { - margin-top: 0; -} - -@include variables.breakpoint('sm') { - .lockup { - grid-template-areas: - 'logo heading' - 'logo subheading'; - } - - .lockup > * { - justify-self: left; - } - - .icon { - margin-bottom: 0; - } - - .heading { - align-self: end; - text-align: left; - } - - .subheading { - align-self: start; - text-align: left; - } -} - -@include variables.breakpoint('xl') { - .heading { - font-size: 40px; - } - - .subheading { - font-size: 25px; - } - - .content { - display: grid; - } - - .content > * { - justify-self: center; - } - - .content [class^='LinkGroupContainer-module'] { - max-width: calc(680px + 300px); - } - - .content > *:not([class^='LinkGroupContainer-module']) { - @include variables.max-width; - } -} diff --git a/src/templates/Overview/Overview.tsx b/src/templates/Overview/Overview.tsx deleted file mode 100644 index 45d1c6699..000000000 --- a/src/templates/Overview/Overview.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { useLocation } from '@reach/router'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import Layout from '../../components/Layout/Layout'; -import ProductIcon from '../../components/ProductIcon'; -import { IOverviewContext } from './query'; - -import * as styles from './Overview.module.scss'; - -interface IOverview { - children: React.ReactNode; - pageContext: IOverviewContext; -} - -const Overview: React.FC = (props) => { - const { frontmatter } = props.pageContext; - const location = useLocation(); - const { description, icon, keywords, title } = frontmatter; - - let type; - - if (location.pathname.startsWith('/minfraud')) { - type = 'minfraud'; - } - - if (location.pathname.startsWith('/geoip')) { - type = 'geoip'; - } - - return ( - -
    -
    -
    - - -

    - -

    - {frontmatter.subtitle} -

    -
    -
    - -
    - {props.children} -
    -
    -
    - ); -}; - -Overview.propTypes = { - children: PropTypes.node.isRequired, - pageContext: PropTypes.any, -}; - -export default Overview; diff --git a/src/templates/Overview/index.ts b/src/templates/Overview/index.ts deleted file mode 100644 index 6be1bace8..000000000 --- a/src/templates/Overview/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as default } from './Overview'; diff --git a/src/templates/Overview/query.ts b/src/templates/Overview/query.ts deleted file mode 100644 index 55f9a3da5..000000000 --- a/src/templates/Overview/query.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import { BaseQuery, IBaseQuery } from '../../baseQuery'; - -export type IOverviewContext = Pick & { - readonly frontmatter: { - readonly icon: string; - readonly subtitle: string; - }; -} - -const query: QueryFn = ( - graphql: GraphqlFn -) => graphql(` - ${BaseQuery} - - query OverviewTemplateQuery { - allMdx(filter: {fields: {layout: {eq: "overviews"}}}) { - nodes { - ... BaseQuery - frontmatter { - subtitle - icon - } - } - } - } -`); - -export default query; diff --git a/src/templates/Page/Page.module.scss b/src/templates/Page/Page.module.scss deleted file mode 100644 index 0d16fad98..000000000 --- a/src/templates/Page/Page.module.scss +++ /dev/null @@ -1,294 +0,0 @@ -@use '../../styles/variables'; - -.article { - padding: var(--mm-spacing); -} - -.header { - background: var(--mm-color-background); - z-index: 5; - @include variables.max-width; -} - -.heading { - margin: 0; - padding: 0 0 var(--mm-spacing); -} - -.aside { - background: var(--mm-color-sidebar); - margin: var(--mm-spacing) 0; - padding: var(--mm-spacing); - position: relative; - - @include variables.pattern-border; -} - -.header + .aside { - margin-top: 0; -} - -.content { - @include variables.max-width; -} - -.content > [id^='toc-']:first-child > *:first-child { - margin-top: 0; -} - -.footer { - border-top: 1px solid var(--mm-color-border); - display: grid; - gap: 20px; - grid-template-columns: 1fr; - grid-template-rows: auto; - padding: var(--mm-spacing) 0; -} - -.lastUpdated { - font-size: 12px; - font-style: italic; - font-weight: 400; - margin-top: calc(var(--mm-spacing) * 2); - text-align: center; -} - -.footerNext, -.footerPrevious { - border-radius: var(--mm-border-radius); - color: var(--mm-color-display-text); - column-gap: calc(var(--mm-spacing) / 2); - display: grid; - font-size: 18px; - font-weight: 500; - grid-template-columns: auto; - grid-template-rows: max-content 1fr; - padding: calc(var(--mm-spacing) / 4) calc(var(--mm-spacing) / 2); - text-decoration: none; - transition: padding 0.2s ease-in-out, background 0.1s ease-in-out; - - &:hover { - background: var(--mm-color-sidebar); - } -} - -/* stylelint-disable no-descending-specificity */ -.footerNext { - grid-template-areas: - 'direction arrow' - 'title arrow'; - grid-template-columns: 1fr min-content; - padding-right: var(--mm-spacing); - text-align: right; - - &:hover { - padding-right: calc(var(--mm-spacing) / 2); - } -} - -.footerPrevious { - grid-template-areas: - 'arrow direction' - 'arrow title'; - grid-template-columns: min-content 1fr; - padding-left: var(--mm-spacing); - - &:hover { - padding-left: calc(var(--mm-spacing) / 2); - } -} -/* stylelint-enable no-descending-specificity */ - -.footerDirection { - color: var(--mm-color-primary-text); - display: block; - font-size: 12px; - font-weight: 500; - grid-area: direction; - text-decoration: none; -} - -.footerTitle { - grid-area: title; -} - -.footerArrow { - align-self: center; - grid-area: arrow; - justify-self: center; -} - -@include variables.breakpoint('sm') { - .footer { - grid-template-areas: 'previous next'; - grid-template-columns: 1fr 1fr; - } - - .footerNext { - grid-area: next; - text-align: right; - } - - .footerPrevious { - grid-area: previous; - } -} - -@include variables.breakpoint('md') { - .article { - display: flex; - flex-direction: column; - height: 100%; - } - - .header, - .aside, - .content, - .footer { - justify-self: center; - } -} - -@include variables.breakpoint('xl') { - .article { - display: grid; - grid-template-areas: - 'header header' - 'aside aside' - 'content content' - 'last-updated last-updated' - 'footer footer'; - grid-template-columns: 50% 50%; - grid-template-rows: min-content min-content 1fr min-content; - height: 100%; - padding: var(--mm-spacing) 0; - } - - .header { - grid-area: header; - padding: 0 var(--mm-spacing) 0; - } - - .header ~ .content > *:first-child { - margin-top: 0; - } - - .aside { - grid-area: aside; - max-width: 800px; - width: 100%; - } - - .content { - grid-area: content; - padding: 0 var(--mm-spacing); - } - - .lastUpdated { - grid-area: last-updated; - } - - .footer { - grid-area: footer; - @include variables.max-width; - } -} - -@include variables.max-breakpoint('xl') { - .article.releaseNotes .aside, - .article.releaseNotes .header { - justify-self: auto; - } -} - - -@include variables.max-breakpoint('xxl') { - .article.releaseNotes { - display: grid; - grid-template-areas: - 'header header' - 'content content' - 'aside aside' - 'footer footer'; - grid-template-columns: 50% 50%; - grid-template-rows: min-content min-content 1fr min-content; - height: 100%; - } - - .article.releaseNotes .header { - grid-area: header; - } - - .article.releaseNotes .header ~ .content > *:first-child { - margin-top: 0; - } - - .article.releaseNotes .aside { - grid-area: aside; - @include variables.max-width; - } - - .article.releaseNotes .content { - grid-area: content; - } - - .article.releaseNotes .footer { - grid-area: footer; - } -} - -@include variables.breakpoint('xxl') { - .article { - grid-template-areas: - 'header aside' - 'content aside' - 'footer aside'; - grid-template-columns: calc(100vw - 640px) var(--mm-layout-toc-width); - grid-template-rows: min-content auto min-content; - /* autoprefixer: ignore next */ - justify-items: start; - } - - .header { - grid-area: header; - } - - .aside { - background: var(--mm-color-background); - border-bottom: 0; - grid-area: aside; - height: auto; - margin: 0; - min-width: auto; - padding: 0; - width: 100%; - } - - .aside::before, - .aside::after { - display: none; - } - - .tableOfContents { - max-height: calc(100vh - var(--page-header-height)); - overflow-y: scroll; - padding: var(--mm-spacing) var(--mm-spacing) 120px 20px; - position: sticky; - top: calc(var(--page-header-height)); - width: 100%; - } - - .content { - grid-area: content; - } -} - -@include variables.breakpoint('xxxl') { - .content { - margin: 0 auto; - } - - .content > [id^='toc-'] { - margin: calc(var(--mm-spacing) * 3) 0; - } -} diff --git a/src/templates/Page/Page.tsx b/src/templates/Page/Page.tsx deleted file mode 100644 index 2292e4214..000000000 --- a/src/templates/Page/Page.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { useLocation } from '@reach/router'; -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; -import { FaArrowLeft, FaArrowRight } from 'react-icons/fa'; - -import Layout from '../../components/Layout/Layout'; -import Link from '../../components/Link'; -import { h1 as H1, p as P } from '../../components/Mdx'; -import { getNextPage, getPreviousPage } from '../../utils/pagination'; -import { IPageContext } from './query'; -import ReleaseNotesArchiveList from './ReleaseNotesArchiveList'; -import TableOfContents from './TableOfContents'; - -import * as styles from './Page.module.scss'; - -interface IPage { - children: React.ReactNode; - pageContext: IPageContext; -} - -const Page: React.FC = (props) => { - const { - frontmatter, - parent, - customTableOfContents: tableOfContents, - } = props.pageContext; - const location = useLocation(); - const { description, keywords, image, title } = frontmatter; - const { modifiedTime } = parent || {}; - - let type; - - if (location.pathname.startsWith('/minfraud')) { - type = 'minfraud'; - } - - if (location.pathname.startsWith('/geoip')) { - type = 'geoip'; - } - - let isReleaseNotesPage = false; - - if (location.pathname.split('/')[2] === 'release-notes' && type) { - isReleaseNotesPage = true; - } - - const nextPage = getNextPage(location.pathname); - const previousPage = getPreviousPage(location.pathname); - - return ( - -
    -
    -

    - {title} -

    -
    - - <> - {tableOfContents !== null && ( - - )} - - -
    - {props.children} - - {modifiedTime && ( -

    - This page was last updated on - {' '} - {modifiedTime} - . -

    - )} -
    - - <> - {(previousPage || nextPage) && ( -
    - <> - {previousPage && ( - - - - Previous - - - {previousPage.title} - - - )} - - - <> - {nextPage && ( - - - - Next - - - {nextPage.title} - - - )} - -
    - )} - -
    -
    - ); -}; - -Page.propTypes = { - children: PropTypes.node.isRequired, - pageContext: PropTypes.any, -}; - -export default Page; diff --git a/src/templates/Page/ReleaseNotesArchiveList.tsx b/src/templates/Page/ReleaseNotesArchiveList.tsx deleted file mode 100644 index 4146d07aa..000000000 --- a/src/templates/Page/ReleaseNotesArchiveList.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; - -import TableOfContents from './TableOfContents'; - -type ProductSlug = 'geoip' | 'minfraud'; - -export interface IReleaseNotesArchiveList { - type: ProductSlug; -} - -const years: Record = { - geoip: [ - 2023, - 2022, - 2021, - 2020, - 2019, - 2018, - 2017, - 2016, - 2015, - 2014, - 2013, - ], - minfraud: [ - 2023, - 2022, - 2021, - 2020, - 2019, - 2018, - 2017, - 2016, - 2015, - 2014, - 2013, - ], -}; - -const generateItems = (type: ProductSlug) => { - // eslint-disable-next-line security/detect-object-injection - const items = years[type].map((year: number) => ({ - items: [], - title: year.toString(), - url: `/${type}/release-notes/${year}`, - })); - - return items; -}; - - -const ReleaseNotesArchiveList: React.FC< - IReleaseNotesArchiveList & React.HTMLProps -> = (props) => { - const { className, type } = props; - - return ( - - ); -}; - -ReleaseNotesArchiveList.propTypes = { - className: PropTypes.string, - type: PropTypes.oneOf([ - 'geoip', - 'minfraud', - ]).isRequired, -}; - -export default ReleaseNotesArchiveList; diff --git a/src/templates/Page/TableOfContents.module.scss b/src/templates/Page/TableOfContents.module.scss deleted file mode 100644 index deaf9370f..000000000 --- a/src/templates/Page/TableOfContents.module.scss +++ /dev/null @@ -1,117 +0,0 @@ -@use '../../styles/variables'; - -.heading { - border-bottom: 1px dashed var(--mm-color-border); - color: var(--mm-color-display-text); - display: inline-block; - font-family: var(--mm-font-stack-display); - font-size: 20px; - font-weight: 500; - margin: calc(var(--mm-spacing) / 2) 0; - padding-bottom: calc(var(--mm-spacing) / 2); - width: 100%; -} - -.list { - font-family: var(--mm-font-stack-display); - margin: calc(var(--mm-spacing) / 2) 0 0; -} - -.list * { - vertical-align: top !important; -} - -.list:last-child { - margin-bottom: 0; -} - -.list .list { - margin-left: 14px; -} - -.listItem { - color: #aaa; - font-size: 14px; - line-height: 1.2em; - margin-bottom: calc(var(--mm-spacing) * 0.75); - position: relative; - - &::before { - content: attr(data-item-number); - position: absolute; - transform: translateX(calc(-100% - 6px)); - } -} - -.listItem:last-child { - margin-bottom: 0; -} - -.listItem .listItem { - font-size: 12px; - margin-bottom: calc(var(--mm-spacing) / 2); -} - -.listItem .listItem:last-child { - margin-bottom: 0; -} - -.listItem a { - --psuedo-padding: 8px; - color: #555; - display: inline-block; - font-weight: 500; - position: relative; - text-decoration: none; - width: calc(100% - var(--mm-spacing)); - - &::before, - &::after { - content: ' '; - display: block; - height: 100%; - padding: var(--psuedo-padding) 0; - position: absolute; - right: 0; - top: 0; - transform: translate(calc(var(--mm-spacing) * 0.5), calc(var(--psuedo-padding) * -1)); - width: calc(100% + var(--mm-spacing) * 2); - z-index: -1; - } - - &::before { - left: 0; - right: initial; - transform: translate(-14px, calc(var(--psuedo-padding) * -1)); - } - - &:hover { - color: var(--mm-color-display-text); - } -} - -.listItem.item__active > a { - color: var(--mm-color-display-text); - - &::before { - border-left: 4px solid rgb(43, 126, 198); - } -} - -.listItem .listItem a::before { - transform: translate(-28px, calc(var(--psuedo-padding) * -1)); -} - -.listItem .listItem .listItem a::before { - transform: translate(-42px, calc(var(--psuedo-padding) * -1)); -} - -.listItem .listItem .listItem .listItem a::before { - transform: translate(-56px, calc(var(--psuedo-padding) * -1)); -} - -@include variables.breakpoint('xl') { - .list { - list-style-position: outside; - } -} diff --git a/src/templates/Page/TableOfContents.tsx b/src/templates/Page/TableOfContents.tsx deleted file mode 100644 index 3856cf293..000000000 --- a/src/templates/Page/TableOfContents.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { useLocation } from '@reach/router'; -import classNames from 'classnames'; -import PropTypes from 'prop-types'; -import React from 'react'; - -import Link from '../../components/Link'; -import useActiveHeading from '../../hooks/useActiveHeading'; - -import * as styles from './TableOfContents.module.scss'; - -export interface IItem { - items: IItem[]; - title: string; - url: string; -} - -export interface ITableOfContents { - heading?: string; - items: IItem[]; -} - -const getIds = ( - items: IItem[] -): string[] => items.reduce((accumulator: string[], item: IItem) => { - const itemIds = item.items ? getIds(item.items) : []; - - return [ - ...accumulator, - item.url.slice(1), - ...itemIds, - ]; -}, []); - -const isActive = (url: string, pathname: string, currentItem?: string) => { - if ( - url === pathname - || ( - currentItem && ( - currentItem === `toc-${url.slice(1)}` - || currentItem === url.slice(1) - ) - ) - ) { - return true; - } - - return false; -}; - -const renderItems = ( - items: IItem[], - pathname: string, - currentItem?: string, -): React.ReactElement => ( -
      - {items.map((item, index) => { - let itemNumber; - let { title } = item; - const regex = new RegExp(/^(\d+)\.\s+([\s|\w|\W]*)$/); - const matches = title.match(regex); - - if (matches) { - itemNumber = `${matches[1]}. `; - title = matches[2]; - } - - return ( -
    • - - {title} - - {item.items && renderItems(item.items, pathname, currentItem)} -
    • - ); - })} -
    -); - -const TableOfContents: React.FC< - ITableOfContents & React.HTMLProps -> = (props) => { - const { heading, items, ...rest } = props; - - const pathname = useLocation().pathname; - const itemIds = getIds(items); - const currentItem = useActiveHeading(itemIds); - - return ( - - ); -}; - -TableOfContents.propTypes = { - heading: PropTypes.string, - items: PropTypes.any, -}; - -export default TableOfContents; diff --git a/src/templates/Page/index.ts b/src/templates/Page/index.ts deleted file mode 100644 index 2855c64f9..000000000 --- a/src/templates/Page/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as default } from './Page'; diff --git a/src/templates/Page/query.ts b/src/templates/Page/query.ts deleted file mode 100644 index 96c0bd95a..000000000 --- a/src/templates/Page/query.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable filenames/match-exported */ -import { BaseQuery, IBaseQuery } from '../../baseQuery'; -import { ITableOfContents } from './TableOfContents'; - -export type IPageContext = IBaseQuery & { - readonly customTableOfContents: ITableOfContents; - readonly parent: { - readonly modifiedTime: string; - }; - readonly timeToRead: number; -}; - -const query: QueryFn = (graphql: GraphqlFn) => - graphql(` - ${BaseQuery} - - query PageTemplateQuery { - allMdx(filter: { fields: { layout: { eq: "pages" } } }) { - nodes { - ...BaseQuery - customTableOfContents(maxDepth: 4) - timeToRead - parent { - ... on File { - modifiedTime(formatString: "MMMM D, YYYY", locale: "en-US") - } - } - } - } - } - `); - -export default query; diff --git a/src/types/Item.ts b/src/types/Item.ts deleted file mode 100644 index 2a924b53e..000000000 --- a/src/types/Item.ts +++ /dev/null @@ -1,22 +0,0 @@ -interface IBaseItem { - hasDivider?: boolean; - icon?: React.ReactElement; - title: string; -} - -export interface IInternalItem extends IBaseItem { - items?: IItem[]; - secondaryItems?: IItem[]; - to: string; -} - -export interface IExternalItem extends IBaseItem { - url: string; -} - -export type IItem = IExternalItem | IInternalItem; - -export const isInternalItem = ( - item: IItem - // eslint-disable-next-line no-prototype-builtins -): item is IInternalItem => item.hasOwnProperty('to'); diff --git a/src/types/globals/index.d.ts b/src/types/globals/index.d.ts deleted file mode 100644 index 566ed72fb..000000000 --- a/src/types/globals/index.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -declare type GraphqlFn = ( - query: string, - variables?: TVariables -) => Promise<{ - data?: { - allMdx: { - nodes: TData[], - }; - }; - errors?: any, -}> - -declare type QueryFn = { - (graphql: GraphqlFn): Promise<{ - data?: { - allMdx: { - nodes: T[]; - }; - }; - errors?: any; - }>; -} - -declare type JsonPrimitive = string | number | boolean | null - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -declare interface IJsonObject extends Record< - string, - JsonPrimitive | IJsonArray | IJsonObject -> {} - -// eslint-disable-next-line @typescript-eslint/no-empty-interface -declare interface IJsonArray extends Array< - JsonPrimitive | IJsonArray | IJsonObject -> {} - -declare type Json = JsonPrimitive | IJsonObject | IJsonArray; diff --git a/src/types/openapi-types/index.d.ts b/src/types/openapi-types/index.d.ts deleted file mode 100644 index 1503cbb86..000000000 --- a/src/types/openapi-types/index.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -/* eslint-disable max-len */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import { OpenAPIV3 as OriginalOpenAPIV3 } from 'openapi-types'; - -declare module 'openapi-types' { - export namespace OpenAPIV3 { - interface BaseSchemaObject { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - 'x-compiled-example'?: any; - 'x-line-numbers'?: string; - } - - type PropertyObject = OriginalOpenAPIV3.ReferenceObject | OriginalOpenAPIV3.SchemaObject; - - interface PropertiesObject { - [name: string]: PropertyObject; - } - - type SchemaComponentObject = OriginalOpenAPIV3.ReferenceObject | OriginalOpenAPIV3.SchemaObject; - - interface SchemaComponentsObject { - [key: string]: SchemaComponentObject; - } - - type CompositeSchemaObject = OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject; - type CompositeSchemaObjects = CompositeSchemaObject[]; - } -} - diff --git a/src/types/remark/index.d.ts b/src/types/remark/index.d.ts deleted file mode 100644 index 0a2be09c7..000000000 --- a/src/types/remark/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'remark'; diff --git a/src/types/vfile-message/index.d.ts b/src/types/vfile-message/index.d.ts deleted file mode 100644 index 7581e7bc1..000000000 --- a/src/types/vfile-message/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module 'vfile-message' { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export type VFileMessage = any; -} diff --git a/src/utils/get-toc-items--direct.fixture.json b/src/utils/get-toc-items--direct.fixture.json deleted file mode 100644 index 04e07eedc..000000000 --- a/src/utils/get-toc-items--direct.fixture.json +++ /dev/null @@ -1,1303 +0,0 @@ -{ - "data": { - "allMdx": { - "nodes": [ - { - "customTableOfContents": { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 12, - "line": 2, - "offset": 12 - }, - "indent": [], - "start": { - "column": 4, - "line": 2, - "offset": 4 - } - }, - "type": "text", - "value": "Level 1a" - } - ], - "depth": 2, - "position": { - "end": { - "column": 12, - "line": 2, - "offset": 12 - }, - "indent": [], - "start": { - "column": 1, - "line": 2, - "offset": 1 - } - }, - "type": "heading" - }, - { - "attributes": [ - { - "name": "name", - "position": { - "end": { - "column": 33, - "line": 4, - "offset": 46 - }, - "start": { - "column": 9, - "line": 4, - "offset": 22 - } - }, - "type": "mdxAttribute", - "value": "Level 1a - Link 1" - }, - { - "name": "services", - "position": { - "end": { - "column": 46, - "line": 4, - "offset": 59 - }, - "start": { - "column": 34, - "line": 4, - "offset": 47 - } - }, - "type": "mdxAttribute", - "value": "*" - } - ], - "children": [ - { - "attributes": [ - { - "name": "example", - "position": { - "end": { - "column": 15, - "line": 6, - "offset": 87 - }, - "start": { - "column": 5, - "line": 6, - "offset": 77 - } - }, - "type": "mdxAttribute", - "value": "" - }, - { - "name": "name", - "position": { - "end": { - "column": 15, - "line": 7, - "offset": 102 - }, - "start": { - "column": 5, - "line": 7, - "offset": 92 - } - }, - "type": "mdxAttribute", - "value": "foo" - }, - { - "name": "type", - "position": { - "end": { - "column": 18, - "line": 8, - "offset": 120 - }, - "start": { - "column": 5, - "line": 8, - "offset": 107 - } - }, - "type": "mdxAttribute", - "value": "string" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 3, - "line": 11, - "offset": 135 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 10, - "offset": 125 - } - }, - "type": "text", - "value": "Foo" - } - ], - "position": { - "end": { - "column": 3, - "line": 11, - "offset": 135 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 10, - "offset": 125 - } - }, - "type": "paragraph" - } - ], - "name": "Property", - "position": { - "end": { - "column": 14, - "line": 11, - "offset": 146 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 5, - "offset": 61 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "Schema", - "position": { - "end": { - "column": 10, - "line": 12, - "offset": 156 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 4, - "offset": 14 - } - }, - "type": "mdxBlockElement" - }, - { - "children": [ - { - "position": { - "end": { - "column": 13, - "line": 14, - "offset": 170 - }, - "indent": [], - "start": { - "column": 5, - "line": 14, - "offset": 162 - } - }, - "type": "text", - "value": "Level 2a" - } - ], - "depth": 3, - "position": { - "end": { - "column": 13, - "line": 14, - "offset": 170 - }, - "indent": [], - "start": { - "column": 1, - "line": 14, - "offset": 158 - } - }, - "type": "heading" - }, - { - "attributes": [ - { - "name": "name", - "position": { - "end": { - "column": 33, - "line": 16, - "offset": 204 - }, - "start": { - "column": 9, - "line": 16, - "offset": 180 - } - }, - "type": "mdxAttribute", - "value": "Level 2a - Link 1" - }, - { - "name": "services", - "position": { - "end": { - "column": 46, - "line": 16, - "offset": 217 - }, - "start": { - "column": 34, - "line": 16, - "offset": 205 - } - }, - "type": "mdxAttribute", - "value": "*" - } - ], - "children": [ - { - "attributes": [ - { - "name": "example", - "position": { - "end": { - "column": 15, - "line": 18, - "offset": 245 - }, - "start": { - "column": 5, - "line": 18, - "offset": 235 - } - }, - "type": "mdxAttribute", - "value": "" - }, - { - "name": "name", - "position": { - "end": { - "column": 15, - "line": 19, - "offset": 260 - }, - "start": { - "column": 5, - "line": 19, - "offset": 250 - } - }, - "type": "mdxAttribute", - "value": "foo" - }, - { - "name": "type", - "position": { - "end": { - "column": 18, - "line": 20, - "offset": 278 - }, - "start": { - "column": 5, - "line": 20, - "offset": 265 - } - }, - "type": "mdxAttribute", - "value": "string" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 3, - "line": 23, - "offset": 293 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 22, - "offset": 283 - } - }, - "type": "text", - "value": "Foo" - } - ], - "position": { - "end": { - "column": 3, - "line": 23, - "offset": 293 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 22, - "offset": 283 - } - }, - "type": "paragraph" - } - ], - "name": "Property", - "position": { - "end": { - "column": 14, - "line": 23, - "offset": 304 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 17, - "offset": 219 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "Schema", - "position": { - "end": { - "column": 10, - "line": 24, - "offset": 314 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 16, - "offset": 172 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [ - { - "name": "name", - "position": { - "end": { - "column": 33, - "line": 26, - "offset": 348 - }, - "start": { - "column": 9, - "line": 26, - "offset": 324 - } - }, - "type": "mdxAttribute", - "value": "Level 2a - Link 2" - }, - { - "name": "services", - "position": { - "end": { - "column": 46, - "line": 26, - "offset": 361 - }, - "start": { - "column": 34, - "line": 26, - "offset": 349 - } - }, - "type": "mdxAttribute", - "value": "*" - } - ], - "children": [ - { - "attributes": [ - { - "name": "example", - "position": { - "end": { - "column": 15, - "line": 28, - "offset": 389 - }, - "start": { - "column": 5, - "line": 28, - "offset": 379 - } - }, - "type": "mdxAttribute", - "value": "" - }, - { - "name": "name", - "position": { - "end": { - "column": 15, - "line": 29, - "offset": 404 - }, - "start": { - "column": 5, - "line": 29, - "offset": 394 - } - }, - "type": "mdxAttribute", - "value": "foo" - }, - { - "name": "type", - "position": { - "end": { - "column": 18, - "line": 30, - "offset": 422 - }, - "start": { - "column": 5, - "line": 30, - "offset": 409 - } - }, - "type": "mdxAttribute", - "value": "string" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 3, - "line": 33, - "offset": 437 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 32, - "offset": 427 - } - }, - "type": "text", - "value": "Foo" - } - ], - "position": { - "end": { - "column": 3, - "line": 33, - "offset": 437 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 32, - "offset": 427 - } - }, - "type": "paragraph" - } - ], - "name": "Property", - "position": { - "end": { - "column": 14, - "line": 33, - "offset": 448 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 27, - "offset": 363 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "Schema", - "position": { - "end": { - "column": 10, - "line": 34, - "offset": 458 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 26, - "offset": 316 - } - }, - "type": "mdxBlockElement" - }, - { - "children": [ - { - "position": { - "end": { - "column": 13, - "line": 36, - "offset": 472 - }, - "indent": [], - "start": { - "column": 5, - "line": 36, - "offset": 464 - } - }, - "type": "text", - "value": "Level 2b" - } - ], - "depth": 3, - "position": { - "end": { - "column": 13, - "line": 36, - "offset": 472 - }, - "indent": [], - "start": { - "column": 1, - "line": 36, - "offset": 460 - } - }, - "type": "heading" - }, - { - "attributes": [ - { - "name": "name", - "position": { - "end": { - "column": 33, - "line": 38, - "offset": 506 - }, - "start": { - "column": 9, - "line": 38, - "offset": 482 - } - }, - "type": "mdxAttribute", - "value": "Level 2b - Link 1" - }, - { - "name": "services", - "position": { - "end": { - "column": 46, - "line": 38, - "offset": 519 - }, - "start": { - "column": 34, - "line": 38, - "offset": 507 - } - }, - "type": "mdxAttribute", - "value": "*" - } - ], - "children": [ - { - "attributes": [ - { - "name": "example", - "position": { - "end": { - "column": 15, - "line": 40, - "offset": 547 - }, - "start": { - "column": 5, - "line": 40, - "offset": 537 - } - }, - "type": "mdxAttribute", - "value": "" - }, - { - "name": "name", - "position": { - "end": { - "column": 15, - "line": 41, - "offset": 562 - }, - "start": { - "column": 5, - "line": 41, - "offset": 552 - } - }, - "type": "mdxAttribute", - "value": "foo" - }, - { - "name": "type", - "position": { - "end": { - "column": 18, - "line": 42, - "offset": 580 - }, - "start": { - "column": 5, - "line": 42, - "offset": 567 - } - }, - "type": "mdxAttribute", - "value": "string" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 3, - "line": 45, - "offset": 595 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 44, - "offset": 585 - } - }, - "type": "text", - "value": "Foo" - } - ], - "position": { - "end": { - "column": 3, - "line": 45, - "offset": 595 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 44, - "offset": 585 - } - }, - "type": "paragraph" - } - ], - "name": "Property", - "position": { - "end": { - "column": 14, - "line": 45, - "offset": 606 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 39, - "offset": 521 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "Schema", - "position": { - "end": { - "column": 10, - "line": 46, - "offset": 616 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 38, - "offset": 474 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [ - { - "name": "name", - "position": { - "end": { - "column": 33, - "line": 48, - "offset": 650 - }, - "start": { - "column": 9, - "line": 48, - "offset": 626 - } - }, - "type": "mdxAttribute", - "value": "Level 2b - Link 2" - }, - { - "name": "services", - "position": { - "end": { - "column": 46, - "line": 48, - "offset": 663 - }, - "start": { - "column": 34, - "line": 48, - "offset": 651 - } - }, - "type": "mdxAttribute", - "value": "*" - } - ], - "children": [ - { - "attributes": [ - { - "name": "example", - "position": { - "end": { - "column": 15, - "line": 50, - "offset": 691 - }, - "start": { - "column": 5, - "line": 50, - "offset": 681 - } - }, - "type": "mdxAttribute", - "value": "" - }, - { - "name": "name", - "position": { - "end": { - "column": 15, - "line": 51, - "offset": 706 - }, - "start": { - "column": 5, - "line": 51, - "offset": 696 - } - }, - "type": "mdxAttribute", - "value": "foo" - }, - { - "name": "type", - "position": { - "end": { - "column": 18, - "line": 52, - "offset": 724 - }, - "start": { - "column": 5, - "line": 52, - "offset": 711 - } - }, - "type": "mdxAttribute", - "value": "string" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 3, - "line": 55, - "offset": 739 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 54, - "offset": 729 - } - }, - "type": "text", - "value": "Foo" - } - ], - "position": { - "end": { - "column": 3, - "line": 55, - "offset": 739 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 54, - "offset": 729 - } - }, - "type": "paragraph" - } - ], - "name": "Property", - "position": { - "end": { - "column": 14, - "line": 55, - "offset": 750 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 49, - "offset": 665 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "Schema", - "position": { - "end": { - "column": 10, - "line": 56, - "offset": 760 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 48, - "offset": 618 - } - }, - "type": "mdxBlockElement" - }, - { - "children": [ - { - "position": { - "end": { - "column": 12, - "line": 58, - "offset": 773 - }, - "indent": [], - "start": { - "column": 4, - "line": 58, - "offset": 765 - } - }, - "type": "text", - "value": "Level 1b" - } - ], - "depth": 2, - "position": { - "end": { - "column": 12, - "line": 58, - "offset": 773 - }, - "indent": [], - "start": { - "column": 1, - "line": 58, - "offset": 762 - } - }, - "type": "heading" - }, - { - "attributes": [ - { - "name": "name", - "position": { - "end": { - "column": 33, - "line": 60, - "offset": 807 - }, - "start": { - "column": 9, - "line": 60, - "offset": 783 - } - }, - "type": "mdxAttribute", - "value": "Level 1b - Link 1" - }, - { - "name": "services", - "position": { - "end": { - "column": 46, - "line": 60, - "offset": 820 - }, - "start": { - "column": 34, - "line": 60, - "offset": 808 - } - }, - "type": "mdxAttribute", - "value": "*" - } - ], - "children": [ - { - "attributes": [ - { - "name": "example", - "position": { - "end": { - "column": 15, - "line": 62, - "offset": 848 - }, - "start": { - "column": 5, - "line": 62, - "offset": 838 - } - }, - "type": "mdxAttribute", - "value": "" - }, - { - "name": "name", - "position": { - "end": { - "column": 15, - "line": 63, - "offset": 863 - }, - "start": { - "column": 5, - "line": 63, - "offset": 853 - } - }, - "type": "mdxAttribute", - "value": "foo" - }, - { - "name": "type", - "position": { - "end": { - "column": 18, - "line": 64, - "offset": 881 - }, - "start": { - "column": 5, - "line": 64, - "offset": 868 - } - }, - "type": "mdxAttribute", - "value": "string" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 3, - "line": 67, - "offset": 896 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 66, - "offset": 886 - } - }, - "type": "text", - "value": "Foo" - } - ], - "position": { - "end": { - "column": 3, - "line": 67, - "offset": 896 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 66, - "offset": 886 - } - }, - "type": "paragraph" - } - ], - "name": "Property", - "position": { - "end": { - "column": 14, - "line": 67, - "offset": 907 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 61, - "offset": 822 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "Schema", - "position": { - "end": { - "column": 10, - "line": 68, - "offset": 917 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 60, - "offset": 775 - } - }, - "type": "mdxBlockElement" - }, - { - "position": { - "end": { - "column": 59, - "line": 71, - "offset": 978 - }, - "indent": [], - "start": { - "column": 1, - "line": 71, - "offset": 920 - } - }, - "type": "export", - "value": "export const _frontmatter = {\"draft\":false,\"title\":\"Test\"}" - } - ], - "position": { - "end": { - "column": 59, - "line": 71, - "offset": 978 - }, - "start": { - "column": 1, - "line": 1, - "offset": 0 - } - }, - "type": "root" - }, - "tableOfContents": { - "items": [ - { - "items": [ - { - "title": "Level 2a", - "url": "#level-2a" - }, - { - "title": "Level 2b", - "url": "#level-2b" - } - ], - "title": "Level 1a", - "url": "#level-1a" - }, - { - "title": "Level 1b", - "url": "#level-1b" - } - ] - } - } - ] - } - }, - "extensions": {} -} diff --git a/src/utils/get-toc-items--indirect.fixture.json b/src/utils/get-toc-items--indirect.fixture.json deleted file mode 100644 index 226aac33d..000000000 --- a/src/utils/get-toc-items--indirect.fixture.json +++ /dev/null @@ -1,4028 +0,0 @@ -{ - "data": { - "allMdx": { - "nodes": [ - { - "customTableOfContents": { - "children": [ - { - "position": { - "end": { - "column": 40, - "line": 3, - "offset": 87 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 2, - "offset": 1 - } - }, - "type": "import", - "value": "import requestJson from './_examples/request';\nimport * as Schemas from './_schemas/';" - }, - { - "children": [ - { - "position": { - "end": { - "column": 30, - "line": 5, - "offset": 118 - }, - "indent": [], - "start": { - "column": 4, - "line": 5, - "offset": 92 - } - }, - "type": "text", - "value": "Authorization and Security" - } - ], - "depth": 2, - "position": { - "end": { - "column": 30, - "line": 5, - "offset": 118 - }, - "indent": [], - "start": { - "column": 1, - "line": 5, - "offset": 89 - } - }, - "type": "heading" - }, - { - "children": [ - { - "position": { - "end": { - "column": 10, - "line": 7, - "offset": 129 - }, - "indent": [], - "start": { - "column": 1, - "line": 7, - "offset": 120 - } - }, - "type": "text", - "value": "The HTTP " - }, - { - "position": { - "end": { - "column": 25, - "line": 7, - "offset": 144 - }, - "indent": [], - "start": { - "column": 10, - "line": 7, - "offset": 129 - } - }, - "type": "inlineCode", - "value": "Authorization" - }, - { - "position": { - "end": { - "column": 6, - "line": 8, - "offset": 204 - }, - "indent": [ - 1 - ], - "start": { - "column": 25, - "line": 7, - "offset": 144 - } - }, - "type": "text", - "value": " header is required for authorization. The username is\nyour " - }, - { - "children": [ - { - "position": { - "end": { - "column": 25, - "line": 8, - "offset": 223 - }, - "indent": [], - "start": { - "column": 7, - "line": 8, - "offset": 205 - } - }, - "type": "text", - "value": "MaxMind account ID" - } - ], - "position": { - "end": { - "column": 83, - "line": 8, - "offset": 281 - }, - "indent": [], - "start": { - "column": 6, - "line": 8, - "offset": 204 - } - }, - "title": null, - "type": "link", - "url": "https://www.maxmind.com/en/accounts/current/license-key" - }, - { - "position": { - "end": { - "column": 22, - "line": 9, - "offset": 304 - }, - "indent": [ - 1 - ], - "start": { - "column": 83, - "line": 8, - "offset": 281 - } - }, - "type": "text", - "value": ".\nThe password is your " - }, - { - "children": [ - { - "position": { - "end": { - "column": 42, - "line": 9, - "offset": 324 - }, - "indent": [], - "start": { - "column": 23, - "line": 9, - "offset": 305 - } - }, - "type": "text", - "value": "MaxMind license key" - } - ], - "position": { - "end": { - "column": 100, - "line": 9, - "offset": 382 - }, - "indent": [], - "start": { - "column": 22, - "line": 9, - "offset": 304 - } - }, - "title": null, - "type": "link", - "url": "https://www.maxmind.com/en/accounts/current/license-key" - }, - { - "position": { - "end": { - "column": 101, - "line": 9, - "offset": 383 - }, - "indent": [], - "start": { - "column": 100, - "line": 9, - "offset": 382 - } - }, - "type": "text", - "value": "." - } - ], - "position": { - "end": { - "column": 101, - "line": 9, - "offset": 383 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 7, - "offset": 120 - } - }, - "type": "paragraph" - }, - { - "attributes": [ - { - "name": "type", - "position": { - "end": { - "column": 22, - "line": 11, - "offset": 406 - }, - "start": { - "column": 8, - "line": 11, - "offset": 392 - } - }, - "type": "mdxAttribute", - "value": "warning" - } - ], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 62, - "line": 13, - "offset": 544 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 12, - "offset": 408 - } - }, - "type": "text", - "value": "You must be approved for a trial or purchase credit for use with our web\nservices in order to receive an account ID and license key." - } - ], - "position": { - "end": { - "column": 62, - "line": 13, - "offset": 544 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 12, - "offset": 408 - } - }, - "type": "paragraph" - } - ], - "name": "Alert", - "position": { - "end": { - "column": 9, - "line": 14, - "offset": 553 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 11, - "offset": 385 - } - }, - "type": "mdxBlockElement" - }, - { - "children": [ - { - "position": { - "end": { - "column": 8, - "line": 16, - "offset": 562 - }, - "indent": [], - "start": { - "column": 1, - "line": 16, - "offset": 555 - } - }, - "type": "text", - "value": "We use " - }, - { - "children": [ - { - "position": { - "end": { - "column": 34, - "line": 16, - "offset": 588 - }, - "indent": [], - "start": { - "column": 9, - "line": 16, - "offset": 563 - } - }, - "type": "text", - "value": "basic HTTP authentication" - } - ], - "position": { - "end": { - "column": 94, - "line": 16, - "offset": 648 - }, - "indent": [], - "start": { - "column": 8, - "line": 16, - "offset": 562 - } - }, - "title": null, - "type": "link", - "url": "https://en.wikipedia.org/wiki/Basic_access_authentication" - }, - { - "position": { - "end": { - "column": 38, - "line": 19, - "offset": 836 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 94, - "line": 16, - "offset": 648 - } - }, - "type": "text", - "value": ".\nThe APIs which require authentication are only available via HTTPS. The\ncredentials are never transmitted unencrypted. If you attempt to access this\nservice via HTTP, you will receive a " - }, - { - "position": { - "end": { - "column": 53, - "line": 19, - "offset": 851 - }, - "indent": [], - "start": { - "column": 38, - "line": 19, - "offset": 836 - } - }, - "type": "inlineCode", - "value": "403 Forbidden" - }, - { - "position": { - "end": { - "column": 68, - "line": 19, - "offset": 866 - }, - "indent": [], - "start": { - "column": 53, - "line": 19, - "offset": 851 - } - }, - "type": "text", - "value": " HTTP response." - } - ], - "position": { - "end": { - "column": 68, - "line": 19, - "offset": 866 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 16, - "offset": 555 - } - }, - "type": "paragraph" - }, - { - "children": [ - { - "position": { - "end": { - "column": 8, - "line": 22, - "offset": 955 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 21, - "offset": 868 - } - }, - "type": "text", - "value": "We require TLS 1.2 or greater for all requests to our servers to keep your data\nsecure." - } - ], - "position": { - "end": { - "column": 8, - "line": 22, - "offset": 955 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 21, - "offset": 868 - } - }, - "type": "paragraph" - }, - { - "children": [ - { - "position": { - "end": { - "column": 21, - "line": 24, - "offset": 977 - }, - "indent": [], - "start": { - "column": 4, - "line": 24, - "offset": 960 - } - }, - "type": "text", - "value": "Service Endpoints" - } - ], - "depth": 2, - "position": { - "end": { - "column": 21, - "line": 24, - "offset": 977 - }, - "indent": [], - "start": { - "column": 1, - "line": 24, - "offset": 957 - } - }, - "type": "heading" - }, - { - "children": [ - { - "position": { - "end": { - "column": 53, - "line": 26, - "offset": 1031 - }, - "indent": [], - "start": { - "column": 1, - "line": 26, - "offset": 979 - } - }, - "type": "text", - "value": "The endpoint for each service is as specified below." - } - ], - "position": { - "end": { - "column": 53, - "line": 26, - "offset": 1031 - }, - "indent": [], - "start": { - "column": 1, - "line": 26, - "offset": 979 - } - }, - "type": "paragraph" - }, - { - "align": [ - null, - null, - null - ], - "children": [ - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 10, - "line": 28, - "offset": 1042 - }, - "indent": [], - "start": { - "column": 3, - "line": 28, - "offset": 1035 - } - }, - "type": "text", - "value": "Service" - } - ], - "position": { - "end": { - "column": 11, - "line": 28, - "offset": 1043 - }, - "indent": [], - "start": { - "column": 3, - "line": 28, - "offset": 1035 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 25, - "line": 28, - "offset": 1057 - }, - "indent": [], - "start": { - "column": 14, - "line": 28, - "offset": 1046 - } - }, - "type": "text", - "value": "HTTP Method" - } - ], - "position": { - "end": { - "column": 25, - "line": 28, - "offset": 1057 - }, - "indent": [], - "start": { - "column": 14, - "line": 28, - "offset": 1046 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 36, - "line": 28, - "offset": 1068 - }, - "indent": [], - "start": { - "column": 28, - "line": 28, - "offset": 1060 - } - }, - "type": "text", - "value": "Endpoint" - } - ], - "position": { - "end": { - "column": 81, - "line": 28, - "offset": 1113 - }, - "indent": [], - "start": { - "column": 28, - "line": 28, - "offset": 1060 - } - }, - "type": "tableCell" - } - ], - "position": { - "end": { - "column": 83, - "line": 28, - "offset": 1115 - }, - "indent": [], - "start": { - "column": 1, - "line": 28, - "offset": 1033 - } - }, - "type": "tableRow" - }, - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 8, - "line": 30, - "offset": 1206 - }, - "indent": [], - "start": { - "column": 3, - "line": 30, - "offset": 1201 - } - }, - "type": "text", - "value": "Score" - } - ], - "position": { - "end": { - "column": 11, - "line": 30, - "offset": 1209 - }, - "indent": [], - "start": { - "column": 3, - "line": 30, - "offset": 1201 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 20, - "line": 30, - "offset": 1218 - }, - "indent": [], - "start": { - "column": 14, - "line": 30, - "offset": 1212 - } - }, - "type": "inlineCode", - "value": "POST" - } - ], - "position": { - "end": { - "column": 25, - "line": 30, - "offset": 1223 - }, - "indent": [], - "start": { - "column": 14, - "line": 30, - "offset": 1212 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 78, - "line": 30, - "offset": 1276 - }, - "indent": [], - "start": { - "column": 28, - "line": 30, - "offset": 1226 - } - }, - "type": "inlineCode", - "value": "https://minfraud.maxmind.com/minfraud/v2.0/score" - } - ], - "position": { - "end": { - "column": 81, - "line": 30, - "offset": 1279 - }, - "indent": [], - "start": { - "column": 28, - "line": 30, - "offset": 1226 - } - }, - "type": "tableCell" - } - ], - "position": { - "end": { - "column": 83, - "line": 30, - "offset": 1281 - }, - "indent": [], - "start": { - "column": 1, - "line": 30, - "offset": 1199 - } - }, - "type": "tableRow" - }, - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 11, - "line": 31, - "offset": 1292 - }, - "indent": [], - "start": { - "column": 3, - "line": 31, - "offset": 1284 - } - }, - "type": "text", - "value": "Insights" - } - ], - "position": { - "end": { - "column": 11, - "line": 31, - "offset": 1292 - }, - "indent": [], - "start": { - "column": 3, - "line": 31, - "offset": 1284 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 20, - "line": 31, - "offset": 1301 - }, - "indent": [], - "start": { - "column": 14, - "line": 31, - "offset": 1295 - } - }, - "type": "inlineCode", - "value": "POST" - } - ], - "position": { - "end": { - "column": 25, - "line": 31, - "offset": 1306 - }, - "indent": [], - "start": { - "column": 14, - "line": 31, - "offset": 1295 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 81, - "line": 31, - "offset": 1362 - }, - "indent": [], - "start": { - "column": 28, - "line": 31, - "offset": 1309 - } - }, - "type": "inlineCode", - "value": "https://minfraud.maxmind.com/minfraud/v2.0/insights" - } - ], - "position": { - "end": { - "column": 81, - "line": 31, - "offset": 1362 - }, - "indent": [], - "start": { - "column": 28, - "line": 31, - "offset": 1309 - } - }, - "type": "tableCell" - } - ], - "position": { - "end": { - "column": 83, - "line": 31, - "offset": 1364 - }, - "indent": [], - "start": { - "column": 1, - "line": 31, - "offset": 1282 - } - }, - "type": "tableRow" - }, - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 10, - "line": 32, - "offset": 1374 - }, - "indent": [], - "start": { - "column": 3, - "line": 32, - "offset": 1367 - } - }, - "type": "text", - "value": "Factors" - } - ], - "position": { - "end": { - "column": 11, - "line": 32, - "offset": 1375 - }, - "indent": [], - "start": { - "column": 3, - "line": 32, - "offset": 1367 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 20, - "line": 32, - "offset": 1384 - }, - "indent": [], - "start": { - "column": 14, - "line": 32, - "offset": 1378 - } - }, - "type": "inlineCode", - "value": "POST" - } - ], - "position": { - "end": { - "column": 25, - "line": 32, - "offset": 1389 - }, - "indent": [], - "start": { - "column": 14, - "line": 32, - "offset": 1378 - } - }, - "type": "tableCell" - }, - { - "children": [ - { - "position": { - "end": { - "column": 80, - "line": 32, - "offset": 1444 - }, - "indent": [], - "start": { - "column": 28, - "line": 32, - "offset": 1392 - } - }, - "type": "inlineCode", - "value": "https://minfraud.maxmind.com/minfraud/v2.0/factors" - } - ], - "position": { - "end": { - "column": 81, - "line": 32, - "offset": 1445 - }, - "indent": [], - "start": { - "column": 28, - "line": 32, - "offset": 1392 - } - }, - "type": "tableCell" - } - ], - "position": { - "end": { - "column": 83, - "line": 32, - "offset": 1447 - }, - "indent": [], - "start": { - "column": 1, - "line": 32, - "offset": 1365 - } - }, - "type": "tableRow" - } - ], - "position": { - "end": { - "column": 83, - "line": 32, - "offset": 1447 - }, - "indent": [ - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 28, - "offset": 1033 - } - }, - "type": "table" - }, - { - "children": [ - { - "position": { - "end": { - "column": 5, - "line": 34, - "offset": 1453 - }, - "indent": [], - "start": { - "column": 1, - "line": 34, - "offset": 1449 - } - }, - "type": "text", - "value": "The " - }, - { - "children": [ - { - "position": { - "end": { - "column": 27, - "line": 34, - "offset": 1475 - }, - "indent": [], - "start": { - "column": 7, - "line": 34, - "offset": 1455 - } - }, - "type": "text", - "value": "minfraud.maxmind.com" - } - ], - "position": { - "end": { - "column": 29, - "line": 34, - "offset": 1477 - }, - "indent": [], - "start": { - "column": 5, - "line": 34, - "offset": 1453 - } - }, - "type": "strong" - }, - { - "position": { - "end": { - "column": 31, - "line": 35, - "offset": 1553 - }, - "indent": [ - 1 - ], - "start": { - "column": 29, - "line": 34, - "offset": 1477 - } - }, - "type": "text", - "value": " hostname automatically picks the data center\ngeographically closest to you." - } - ], - "position": { - "end": { - "column": 31, - "line": 35, - "offset": 1553 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 34, - "offset": 1449 - } - }, - "type": "paragraph" - }, - { - "children": [ - { - "position": { - "end": { - "column": 11, - "line": 37, - "offset": 1565 - }, - "indent": [], - "start": { - "column": 4, - "line": 37, - "offset": 1558 - } - }, - "type": "text", - "value": "Headers" - } - ], - "depth": 2, - "position": { - "end": { - "column": 11, - "line": 37, - "offset": 1565 - }, - "indent": [], - "start": { - "column": 1, - "line": 37, - "offset": 1555 - } - }, - "type": "heading" - }, - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 17, - "line": 42, - "offset": 1610 - }, - "indent": [], - "start": { - "column": 11, - "line": 42, - "offset": 1604 - } - }, - "type": "text", - "value": "Header" - } - ], - "position": { - "end": { - "column": 17, - "line": 42, - "offset": 1610 - }, - "indent": [], - "start": { - "column": 11, - "line": 42, - "offset": 1604 - } - }, - "type": "paragraph" - } - ], - "name": "th", - "position": { - "end": { - "column": 22, - "line": 42, - "offset": 1615 - }, - "indent": [], - "start": { - "column": 1, - "line": 42, - "offset": 1594 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 16, - "line": 43, - "offset": 1631 - }, - "indent": [], - "start": { - "column": 11, - "line": 43, - "offset": 1626 - } - }, - "type": "text", - "value": "Notes" - } - ], - "position": { - "end": { - "column": 16, - "line": 43, - "offset": 1631 - }, - "indent": [], - "start": { - "column": 11, - "line": 43, - "offset": 1626 - } - }, - "type": "paragraph" - } - ], - "name": "th", - "position": { - "end": { - "column": 21, - "line": 43, - "offset": 1636 - }, - "indent": [], - "start": { - "column": 1, - "line": 43, - "offset": 1616 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "tr", - "position": { - "end": { - "column": 10, - "line": 44, - "offset": 1646 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 41, - "offset": 1585 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "thead", - "position": { - "end": { - "column": 11, - "line": 45, - "offset": 1657 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 40, - "offset": 1575 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 24, - "line": 49, - "offset": 1711 - }, - "indent": [], - "start": { - "column": 9, - "line": 49, - "offset": 1696 - } - }, - "type": "inlineCode", - "value": "Authorization" - } - ], - "position": { - "end": { - "column": 7, - "line": 50, - "offset": 1718 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 49, - "offset": 1688 - } - }, - "type": "paragraph" - } - ], - "name": "td", - "position": { - "end": { - "column": 12, - "line": 50, - "offset": 1723 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 48, - "offset": 1677 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 19, - "line": 52, - "offset": 1753 - }, - "indent": [], - "start": { - "column": 11, - "line": 52, - "offset": 1745 - } - }, - "type": "text", - "value": "Required" - } - ], - "position": { - "end": { - "column": 21, - "line": 52, - "offset": 1755 - }, - "indent": [], - "start": { - "column": 9, - "line": 52, - "offset": 1743 - } - }, - "type": "strong" - }, - { - "position": { - "end": { - "column": 9, - "line": 53, - "offset": 1788 - }, - "indent": [ - 1 - ], - "start": { - "column": 21, - "line": 52, - "offset": 1755 - } - }, - "type": "text", - "value": " – For more details, see\n" - }, - { - "children": [ - { - "position": { - "end": { - "column": 36, - "line": 53, - "offset": 1815 - }, - "indent": [], - "start": { - "column": 10, - "line": 53, - "offset": 1789 - } - }, - "type": "text", - "value": "Authorization and Security" - } - ], - "position": { - "end": { - "column": 66, - "line": 53, - "offset": 1845 - }, - "indent": [], - "start": { - "column": 9, - "line": 53, - "offset": 1788 - } - }, - "title": null, - "type": "link", - "url": "#authorization-and-security" - }, - { - "position": { - "end": { - "column": 7, - "line": 54, - "offset": 1853 - }, - "indent": [ - 1 - ], - "start": { - "column": 66, - "line": 53, - "offset": 1845 - } - }, - "type": "text", - "value": "." - } - ], - "position": { - "end": { - "column": 7, - "line": 54, - "offset": 1853 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 52, - "offset": 1735 - } - }, - "type": "paragraph" - } - ], - "name": "td", - "position": { - "end": { - "column": 12, - "line": 54, - "offset": 1858 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 51, - "offset": 1724 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "tr", - "position": { - "end": { - "column": 10, - "line": 55, - "offset": 1868 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 47, - "offset": 1668 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 17, - "line": 58, - "offset": 1905 - }, - "indent": [], - "start": { - "column": 9, - "line": 58, - "offset": 1897 - } - }, - "type": "inlineCode", - "value": "Accept" - } - ], - "position": { - "end": { - "column": 7, - "line": 59, - "offset": 1912 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 58, - "offset": 1889 - } - }, - "type": "paragraph" - } - ], - "name": "td", - "position": { - "end": { - "column": 12, - "line": 59, - "offset": 1917 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 57, - "offset": 1878 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 19, - "line": 61, - "offset": 1947 - }, - "indent": [], - "start": { - "column": 11, - "line": 61, - "offset": 1939 - } - }, - "type": "text", - "value": "Optional" - } - ], - "position": { - "end": { - "column": 21, - "line": 61, - "offset": 1949 - }, - "indent": [], - "start": { - "column": 9, - "line": 61, - "offset": 1937 - } - }, - "type": "strong" - }, - { - "position": { - "end": { - "column": 49, - "line": 62, - "offset": 2054 - }, - "indent": [ - 1 - ], - "start": { - "column": 21, - "line": 61, - "offset": 1949 - } - }, - "type": "text", - "value": " – If you do set this header, you must accept any of the\nfollowing, substituting the appropriate " - }, - { - "position": { - "end": { - "column": 65, - "line": 62, - "offset": 2070 - }, - "indent": [], - "start": { - "column": 49, - "line": 62, - "offset": 2054 - } - }, - "type": "inlineCode", - "value": "[SERVICE TYPE]" - }, - { - "position": { - "end": { - "column": 9, - "line": 63, - "offset": 2090 - }, - "indent": [ - 1 - ], - "start": { - "column": 65, - "line": 62, - "offset": 2070 - } - }, - "type": "text", - "value": " for either\n" - }, - { - "position": { - "end": { - "column": 16, - "line": 63, - "offset": 2097 - }, - "indent": [], - "start": { - "column": 9, - "line": 63, - "offset": 2090 - } - }, - "type": "inlineCode", - "value": "score" - }, - { - "position": { - "end": { - "column": 18, - "line": 63, - "offset": 2099 - }, - "indent": [], - "start": { - "column": 16, - "line": 63, - "offset": 2097 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 27, - "line": 63, - "offset": 2108 - }, - "indent": [], - "start": { - "column": 18, - "line": 63, - "offset": 2099 - } - }, - "type": "inlineCode", - "value": "factors" - }, - { - "position": { - "end": { - "column": 32, - "line": 63, - "offset": 2113 - }, - "indent": [], - "start": { - "column": 27, - "line": 63, - "offset": 2108 - } - }, - "type": "text", - "value": ", or " - }, - { - "position": { - "end": { - "column": 42, - "line": 63, - "offset": 2123 - }, - "indent": [], - "start": { - "column": 32, - "line": 63, - "offset": 2113 - } - }, - "type": "inlineCode", - "value": "insights" - }, - { - "position": { - "end": { - "column": 43, - "line": 63, - "offset": 2124 - }, - "indent": [], - "start": { - "column": 42, - "line": 63, - "offset": 2123 - } - }, - "type": "text", - "value": ":" - } - ], - "position": { - "end": { - "column": 43, - "line": 63, - "offset": 2124 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 61, - "offset": 1929 - } - }, - "type": "paragraph" - }, - { - "children": [ - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 29, - "line": 65, - "offset": 2154 - }, - "indent": [], - "start": { - "column": 11, - "line": 65, - "offset": 2136 - } - }, - "type": "inlineCode", - "value": "application/json" - } - ], - "position": { - "end": { - "column": 29, - "line": 65, - "offset": 2154 - }, - "indent": [], - "start": { - "column": 11, - "line": 65, - "offset": 2136 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 29, - "line": 65, - "offset": 2154 - }, - "indent": [], - "start": { - "column": 1, - "line": 65, - "offset": 2126 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 69, - "line": 66, - "offset": 2223 - }, - "indent": [], - "start": { - "column": 11, - "line": 66, - "offset": 2165 - } - }, - "type": "inlineCode", - "value": "application/vnd.maxmind.com-minfraud-[SERVICE TYPE]+json" - } - ], - "position": { - "end": { - "column": 69, - "line": 66, - "offset": 2223 - }, - "indent": [], - "start": { - "column": 11, - "line": 66, - "offset": 2165 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 69, - "line": 66, - "offset": 2223 - }, - "indent": [], - "start": { - "column": 1, - "line": 66, - "offset": 2155 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 97, - "line": 67, - "offset": 2320 - }, - "indent": [], - "start": { - "column": 11, - "line": 67, - "offset": 2234 - } - }, - "type": "inlineCode", - "value": "application/vnd.maxmind.com-minfraud-[SERVICE TYPE]+json; charset=UTF-8; version=2.0" - } - ], - "position": { - "end": { - "column": 97, - "line": 67, - "offset": 2320 - }, - "indent": [], - "start": { - "column": 11, - "line": 67, - "offset": 2234 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 97, - "line": 67, - "offset": 2320 - }, - "indent": [], - "start": { - "column": 1, - "line": 67, - "offset": 2224 - } - }, - "spread": false, - "type": "listItem" - } - ], - "ordered": false, - "position": { - "end": { - "column": 97, - "line": 67, - "offset": 2320 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 65, - "offset": 2126 - } - }, - "spread": false, - "start": null, - "type": "list" - }, - { - "children": [ - { - "position": { - "end": { - "column": 60, - "line": 70, - "offset": 2382 - }, - "indent": [], - "start": { - "column": 1, - "line": 70, - "offset": 2323 - } - }, - "type": "text", - "value": "A request for any other MIME type will result in a " - }, - { - "position": { - "end": { - "column": 88, - "line": 70, - "offset": 2410 - }, - "indent": [], - "start": { - "column": 60, - "line": 70, - "offset": 2382 - } - }, - "type": "inlineCode", - "value": "415 Unsupported Media Type" - }, - { - "position": { - "end": { - "column": 7, - "line": 71, - "offset": 2424 - }, - "indent": [ - 1 - ], - "start": { - "column": 88, - "line": 70, - "offset": 2410 - } - }, - "type": "text", - "value": " error." - } - ], - "position": { - "end": { - "column": 7, - "line": 71, - "offset": 2424 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 70, - "offset": 2323 - } - }, - "type": "paragraph" - } - ], - "name": "td", - "position": { - "end": { - "column": 12, - "line": 71, - "offset": 2429 - }, - "indent": [ - 1, - 1, - 1, - 1, - 11, - 11, - 11, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 60, - "offset": 1918 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "tr", - "position": { - "end": { - "column": 10, - "line": 72, - "offset": 2439 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 11, - 11, - 11, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 56, - "offset": 1869 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "attributes": [], - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 25, - "line": 75, - "offset": 2484 - }, - "indent": [], - "start": { - "column": 9, - "line": 75, - "offset": 2468 - } - }, - "type": "inlineCode", - "value": "Accept-Charset" - } - ], - "position": { - "end": { - "column": 7, - "line": 76, - "offset": 2491 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 75, - "offset": 2460 - } - }, - "type": "paragraph" - } - ], - "name": "td", - "position": { - "end": { - "column": 12, - "line": 76, - "offset": 2496 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 74, - "offset": 2449 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [ - { - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 19, - "line": 78, - "offset": 2526 - }, - "indent": [], - "start": { - "column": 11, - "line": 78, - "offset": 2518 - } - }, - "type": "text", - "value": "Optional" - } - ], - "position": { - "end": { - "column": 21, - "line": 78, - "offset": 2528 - }, - "indent": [], - "start": { - "column": 9, - "line": 78, - "offset": 2516 - } - }, - "type": "strong" - }, - { - "position": { - "end": { - "column": 71, - "line": 78, - "offset": 2578 - }, - "indent": [], - "start": { - "column": 21, - "line": 78, - "offset": 2528 - } - }, - "type": "text", - "value": " – If you do set this header, you must accept the " - }, - { - "position": { - "end": { - "column": 78, - "line": 78, - "offset": 2585 - }, - "indent": [], - "start": { - "column": 71, - "line": 78, - "offset": 2578 - } - }, - "type": "inlineCode", - "value": "UTF-8" - }, - { - "position": { - "end": { - "column": 56, - "line": 79, - "offset": 2641 - }, - "indent": [ - 1 - ], - "start": { - "column": 78, - "line": 78, - "offset": 2585 - } - }, - "type": "text", - "value": "\ncharacter set. If you don't you will receive a " - }, - { - "position": { - "end": { - "column": 76, - "line": 79, - "offset": 2661 - }, - "indent": [], - "start": { - "column": 56, - "line": 79, - "offset": 2641 - } - }, - "type": "inlineCode", - "value": "406 Not Acceptable" - }, - { - "position": { - "end": { - "column": 58, - "line": 80, - "offset": 2719 - }, - "indent": [ - 1 - ], - "start": { - "column": 76, - "line": 79, - "offset": 2661 - } - }, - "type": "text", - "value": "\nresponse, because this data is only available in " - }, - { - "position": { - "end": { - "column": 65, - "line": 80, - "offset": 2726 - }, - "indent": [], - "start": { - "column": 58, - "line": 80, - "offset": 2719 - } - }, - "type": "inlineCode", - "value": "UTF-8" - }, - { - "position": { - "end": { - "column": 7, - "line": 81, - "offset": 2734 - }, - "indent": [ - 1 - ], - "start": { - "column": 65, - "line": 80, - "offset": 2726 - } - }, - "type": "text", - "value": "." - } - ], - "position": { - "end": { - "column": 7, - "line": 81, - "offset": 2734 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 78, - "offset": 2508 - } - }, - "type": "paragraph" - } - ], - "name": "td", - "position": { - "end": { - "column": 12, - "line": 81, - "offset": 2739 - }, - "indent": [ - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 77, - "offset": 2497 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "tr", - "position": { - "end": { - "column": 10, - "line": 82, - "offset": 2749 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 73, - "offset": 2440 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "tbody", - "position": { - "end": { - "column": 11, - "line": 83, - "offset": 2760 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 11, - 11, - 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 46, - "offset": 1658 - } - }, - "type": "mdxBlockElement" - } - ], - "name": "table", - "position": { - "end": { - "column": 9, - "line": 84, - "offset": 2769 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 11, - 11, - 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 39, - "offset": 1567 - } - }, - "type": "mdxBlockElement" - }, - { - "children": [ - { - "position": { - "end": { - "column": 10, - "line": 86, - "offset": 2780 - }, - "indent": [], - "start": { - "column": 4, - "line": 86, - "offset": 2774 - } - }, - "type": "text", - "value": "Bodies" - } - ], - "depth": 2, - "position": { - "end": { - "column": 10, - "line": 86, - "offset": 2780 - }, - "indent": [], - "start": { - "column": 1, - "line": 86, - "offset": 2771 - } - }, - "type": "heading" - }, - { - "children": [ - { - "position": { - "end": { - "column": 1, - "line": 90, - "offset": 2994 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 87, - "offset": 2781 - } - }, - "type": "text", - "value": "minFraud Score, Factors and Insights share the same request body format. Below\nis a full example of the JSON body document. For detailed explainations of each\nproperty within the request body, please refer to the\n" - }, - { - "children": [ - { - "position": { - "end": { - "column": 18, - "line": 90, - "offset": 3011 - }, - "indent": [], - "start": { - "column": 2, - "line": 90, - "offset": 2995 - } - }, - "type": "text", - "value": "object reference" - } - ], - "position": { - "end": { - "column": 38, - "line": 90, - "offset": 3031 - }, - "indent": [], - "start": { - "column": 1, - "line": 90, - "offset": 2994 - } - }, - "title": null, - "type": "link", - "url": "#object-reference" - }, - { - "position": { - "end": { - "column": 53, - "line": 90, - "offset": 3046 - }, - "indent": [], - "start": { - "column": 38, - "line": 90, - "offset": 3031 - } - }, - "type": "text", - "value": " section below." - } - ], - "position": { - "end": { - "column": 53, - "line": 90, - "offset": 3046 - }, - "indent": [ - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 87, - "offset": 2781 - } - }, - "type": "paragraph" - }, - { - "attributes": [ - { - "name": "language", - "position": { - "end": { - "column": 25, - "line": 92, - "offset": 3072 - }, - "start": { - "column": 10, - "line": 92, - "offset": 3057 - } - }, - "type": "mdxAttribute", - "value": "json" - } - ], - "children": [ - { - "position": { - "end": { - "column": 41, - "line": 93, - "offset": 3114 - }, - "indent": [], - "start": { - "column": 1, - "line": 93, - "offset": 3074 - } - }, - "type": "mdxBlockExpression", - "value": "JSON.stringify(requestJson, null, 2)" - } - ], - "name": "Example", - "position": { - "end": { - "column": 11, - "line": 94, - "offset": 3125 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 92, - "offset": 3048 - } - }, - "type": "mdxBlockElement" - }, - { - "children": [ - { - "position": { - "end": { - "column": 20, - "line": 96, - "offset": 3146 - }, - "indent": [], - "start": { - "column": 4, - "line": 96, - "offset": 3130 - } - }, - "type": "text", - "value": "Object Reference" - } - ], - "depth": 2, - "position": { - "end": { - "column": 20, - "line": 96, - "offset": 3146 - }, - "indent": [], - "start": { - "column": 1, - "line": 96, - "offset": 3127 - } - }, - "type": "heading" - }, - { - "children": [ - { - "position": { - "end": { - "column": 8, - "line": 99, - "offset": 3230 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 98, - "offset": 3148 - } - }, - "type": "text", - "value": "Below are the schema definitions of that make up the minFraud request body\nobject." - } - ], - "position": { - "end": { - "column": 8, - "line": 99, - "offset": 3230 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 98, - "offset": 3148 - } - }, - "type": "paragraph" - }, - { - "children": [ - { - "position": { - "end": { - "column": 22, - "line": 103, - "offset": 3412 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 101, - "offset": 3232 - } - }, - "type": "text", - "value": "Each schema definition contains a description of an object, along with a list of\nproperties that belong to the object. The following information is listed for\neach object property:" - } - ], - "position": { - "end": { - "column": 22, - "line": 103, - "offset": 3412 - }, - "indent": [ - 1, - 1 - ], - "start": { - "column": 1, - "line": 101, - "offset": 3232 - } - }, - "type": "paragraph" - }, - { - "children": [ - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 7, - "line": 105, - "offset": 3420 - }, - "indent": [], - "start": { - "column": 3, - "line": 105, - "offset": 3416 - } - }, - "type": "text", - "value": "name" - } - ], - "position": { - "end": { - "column": 7, - "line": 105, - "offset": 3420 - }, - "indent": [], - "start": { - "column": 3, - "line": 105, - "offset": 3416 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 7, - "line": 105, - "offset": 3420 - }, - "indent": [], - "start": { - "column": 1, - "line": 105, - "offset": 3414 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 9, - "line": 106, - "offset": 3429 - }, - "indent": [], - "start": { - "column": 3, - "line": 106, - "offset": 3423 - } - }, - "type": "text", - "value": "type (" - }, - { - "position": { - "end": { - "column": 22, - "line": 106, - "offset": 3442 - }, - "indent": [], - "start": { - "column": 9, - "line": 106, - "offset": 3429 - } - }, - "type": "inlineCode", - "value": "array" - }, - { - "position": { - "end": { - "column": 24, - "line": 106, - "offset": 3444 - }, - "indent": [], - "start": { - "column": 22, - "line": 106, - "offset": 3442 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 33, - "line": 106, - "offset": 3453 - }, - "indent": [], - "start": { - "column": 24, - "line": 106, - "offset": 3444 - } - }, - "type": "inlineCode", - "value": "boolean" - }, - { - "position": { - "end": { - "column": 35, - "line": 106, - "offset": 3455 - }, - "indent": [], - "start": { - "column": 33, - "line": 106, - "offset": 3453 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 43, - "line": 106, - "offset": 3463 - }, - "indent": [], - "start": { - "column": 35, - "line": 106, - "offset": 3455 - } - }, - "type": "inlineCode", - "value": "number" - }, - { - "position": { - "end": { - "column": 45, - "line": 106, - "offset": 3465 - }, - "indent": [], - "start": { - "column": 43, - "line": 106, - "offset": 3463 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 54, - "line": 106, - "offset": 3474 - }, - "indent": [], - "start": { - "column": 45, - "line": 106, - "offset": 3465 - } - }, - "type": "inlineCode", - "value": "integer" - }, - { - "position": { - "end": { - "column": 56, - "line": 106, - "offset": 3476 - }, - "indent": [], - "start": { - "column": 54, - "line": 106, - "offset": 3474 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 64, - "line": 106, - "offset": 3484 - }, - "indent": [], - "start": { - "column": 56, - "line": 106, - "offset": 3476 - } - }, - "type": "inlineCode", - "value": "object" - }, - { - "position": { - "end": { - "column": 66, - "line": 106, - "offset": 3486 - }, - "indent": [], - "start": { - "column": 64, - "line": 106, - "offset": 3484 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 74, - "line": 106, - "offset": 3494 - }, - "indent": [], - "start": { - "column": 66, - "line": 106, - "offset": 3486 - } - }, - "type": "inlineCode", - "value": "string" - }, - { - "position": { - "end": { - "column": 75, - "line": 106, - "offset": 3495 - }, - "indent": [], - "start": { - "column": 74, - "line": 106, - "offset": 3494 - } - }, - "type": "text", - "value": ")" - } - ], - "position": { - "end": { - "column": 75, - "line": 106, - "offset": 3495 - }, - "indent": [], - "start": { - "column": 3, - "line": 106, - "offset": 3423 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 75, - "line": 106, - "offset": 3495 - }, - "indent": [], - "start": { - "column": 1, - "line": 106, - "offset": 3421 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 14, - "line": 107, - "offset": 3509 - }, - "indent": [], - "start": { - "column": 3, - "line": 107, - "offset": 3498 - } - }, - "type": "text", - "value": "description" - } - ], - "position": { - "end": { - "column": 14, - "line": 107, - "offset": 3509 - }, - "indent": [], - "start": { - "column": 3, - "line": 107, - "offset": 3498 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 14, - "line": 107, - "offset": 3509 - }, - "indent": [], - "start": { - "column": 1, - "line": 107, - "offset": 3496 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 10, - "line": 108, - "offset": 3519 - }, - "indent": [], - "start": { - "column": 3, - "line": 108, - "offset": 3512 - } - }, - "type": "text", - "value": "example" - } - ], - "position": { - "end": { - "column": 10, - "line": 108, - "offset": 3519 - }, - "indent": [], - "start": { - "column": 3, - "line": 108, - "offset": 3512 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 10, - "line": 108, - "offset": 3519 - }, - "indent": [], - "start": { - "column": 1, - "line": 108, - "offset": 3510 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 13, - "line": 109, - "offset": 3532 - }, - "indent": [], - "start": { - "column": 3, - "line": 109, - "offset": 3522 - } - }, - "type": "text", - "value": "formatting" - } - ], - "position": { - "end": { - "column": 13, - "line": 109, - "offset": 3532 - }, - "indent": [], - "start": { - "column": 3, - "line": 109, - "offset": 3522 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 13, - "line": 109, - "offset": 3532 - }, - "indent": [], - "start": { - "column": 1, - "line": 109, - "offset": 3520 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 50, - "line": 110, - "offset": 3582 - }, - "indent": [], - "start": { - "column": 3, - "line": 110, - "offset": 3535 - } - }, - "type": "text", - "value": "constraints (format, min/max, max length, etc.)" - } - ], - "position": { - "end": { - "column": 50, - "line": 110, - "offset": 3582 - }, - "indent": [], - "start": { - "column": 3, - "line": 110, - "offset": 3535 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 50, - "line": 110, - "offset": 3582 - }, - "indent": [], - "start": { - "column": 1, - "line": 110, - "offset": 3533 - } - }, - "spread": false, - "type": "listItem" - }, - { - "checked": null, - "children": [ - { - "children": [ - { - "position": { - "end": { - "column": 23, - "line": 111, - "offset": 3605 - }, - "indent": [], - "start": { - "column": 3, - "line": 111, - "offset": 3585 - } - }, - "type": "text", - "value": "supported services (" - }, - { - "position": { - "end": { - "column": 30, - "line": 111, - "offset": 3612 - }, - "indent": [], - "start": { - "column": 23, - "line": 111, - "offset": 3605 - } - }, - "type": "inlineCode", - "value": "Score" - }, - { - "position": { - "end": { - "column": 32, - "line": 111, - "offset": 3614 - }, - "indent": [], - "start": { - "column": 30, - "line": 111, - "offset": 3612 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 41, - "line": 111, - "offset": 3623 - }, - "indent": [], - "start": { - "column": 32, - "line": 111, - "offset": 3614 - } - }, - "type": "inlineCode", - "value": "Factors" - }, - { - "position": { - "end": { - "column": 43, - "line": 111, - "offset": 3625 - }, - "indent": [], - "start": { - "column": 41, - "line": 111, - "offset": 3623 - } - }, - "type": "text", - "value": ", " - }, - { - "position": { - "end": { - "column": 53, - "line": 111, - "offset": 3635 - }, - "indent": [], - "start": { - "column": 43, - "line": 111, - "offset": 3625 - } - }, - "type": "inlineCode", - "value": "Insights" - }, - { - "position": { - "end": { - "column": 54, - "line": 111, - "offset": 3636 - }, - "indent": [], - "start": { - "column": 53, - "line": 111, - "offset": 3635 - } - }, - "type": "text", - "value": ")" - } - ], - "position": { - "end": { - "column": 54, - "line": 111, - "offset": 3636 - }, - "indent": [], - "start": { - "column": 3, - "line": 111, - "offset": 3585 - } - }, - "type": "paragraph" - } - ], - "position": { - "end": { - "column": 54, - "line": 111, - "offset": 3636 - }, - "indent": [], - "start": { - "column": 1, - "line": 111, - "offset": 3583 - } - }, - "spread": false, - "type": "listItem" - } - ], - "ordered": false, - "position": { - "end": { - "column": 54, - "line": 111, - "offset": 3636 - }, - "indent": [ - 1, - 1, - 1, - 1, - 1, - 1 - ], - "start": { - "column": 1, - "line": 105, - "offset": 3414 - } - }, - "spread": false, - "start": null, - "type": "list" - }, - { - "children": [ - { - "position": { - "end": { - "column": 19, - "line": 113, - "offset": 3656 - }, - "indent": [], - "start": { - "column": 1, - "line": 113, - "offset": 3638 - } - }, - "type": "text", - "value": "Additionally, for " - }, - { - "position": { - "end": { - "column": 27, - "line": 113, - "offset": 3664 - }, - "indent": [], - "start": { - "column": 19, - "line": 113, - "offset": 3656 - } - }, - "type": "inlineCode", - "value": "object" - }, - { - "position": { - "end": { - "column": 56, - "line": 114, - "offset": 3768 - }, - "indent": [ - 1 - ], - "start": { - "column": 27, - "line": 113, - "offset": 3664 - } - }, - "type": "text", - "value": " properties, a link is provided to view a schema\ndefinition that further describes that specific object." - } - ], - "position": { - "end": { - "column": 56, - "line": 114, - "offset": 3768 - }, - "indent": [ - 1 - ], - "start": { - "column": 1, - "line": 113, - "offset": 3638 - } - }, - "type": "paragraph" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.Request", - "position": { - "end": { - "column": 20, - "line": 116, - "offset": 3789 - }, - "indent": [], - "start": { - "column": 1, - "line": 116, - "offset": 3770 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestDevice", - "position": { - "end": { - "column": 26, - "line": 117, - "offset": 3815 - }, - "indent": [], - "start": { - "column": 1, - "line": 117, - "offset": 3790 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestEvent", - "position": { - "end": { - "column": 25, - "line": 118, - "offset": 3840 - }, - "indent": [], - "start": { - "column": 1, - "line": 118, - "offset": 3816 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestAccount", - "position": { - "end": { - "column": 27, - "line": 119, - "offset": 3867 - }, - "indent": [], - "start": { - "column": 1, - "line": 119, - "offset": 3841 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestEmail", - "position": { - "end": { - "column": 25, - "line": 120, - "offset": 3892 - }, - "indent": [], - "start": { - "column": 1, - "line": 120, - "offset": 3868 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestBilling", - "position": { - "end": { - "column": 27, - "line": 121, - "offset": 3919 - }, - "indent": [], - "start": { - "column": 1, - "line": 121, - "offset": 3893 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestShipping", - "position": { - "end": { - "column": 28, - "line": 122, - "offset": 3947 - }, - "indent": [], - "start": { - "column": 1, - "line": 122, - "offset": 3920 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestPayment", - "position": { - "end": { - "column": 27, - "line": 123, - "offset": 3974 - }, - "indent": [], - "start": { - "column": 1, - "line": 123, - "offset": 3948 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestCreditCard", - "position": { - "end": { - "column": 30, - "line": 124, - "offset": 4004 - }, - "indent": [], - "start": { - "column": 1, - "line": 124, - "offset": 3975 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestOrder", - "position": { - "end": { - "column": 25, - "line": 125, - "offset": 4029 - }, - "indent": [], - "start": { - "column": 1, - "line": 125, - "offset": 4005 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestShoppingCart", - "position": { - "end": { - "column": 32, - "line": 126, - "offset": 4061 - }, - "indent": [], - "start": { - "column": 1, - "line": 126, - "offset": 4030 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestShoppingCartItem", - "position": { - "end": { - "column": 36, - "line": 127, - "offset": 4097 - }, - "indent": [], - "start": { - "column": 1, - "line": 127, - "offset": 4062 - } - }, - "type": "mdxBlockElement" - }, - { - "attributes": [], - "children": [], - "name": "Schemas.RequestCustomInputs", - "position": { - "end": { - "column": 32, - "line": 128, - "offset": 4129 - }, - "indent": [], - "start": { - "column": 1, - "line": 128, - "offset": 4098 - } - }, - "type": "mdxBlockElement" - }, - { - "position": { - "end": { - "column": 76, - "line": 131, - "offset": 4207 - }, - "indent": [], - "start": { - "column": 1, - "line": 131, - "offset": 4132 - } - }, - "type": "export", - "value": "export const _frontmatter = {\"draft\":false,\"title\":\"minFraud API Requests\"}" - } - ], - "position": { - "end": { - "column": 76, - "line": 131, - "offset": 4207 - }, - "start": { - "column": 1, - "line": 1, - "offset": 0 - } - }, - "type": "root" - } - } - ] - } - }, - "extensions": {} -} diff --git a/src/utils/get-toc-items.spec.ts b/src/utils/get-toc-items.spec.ts deleted file mode 100644 index 502564dda..000000000 --- a/src/utils/get-toc-items.spec.ts +++ /dev/null @@ -1,160 +0,0 @@ -import generateTableOfContents, { createImportPathMap } from './get-toc-items'; -import directSchemas from './get-toc-items--direct.fixture.json'; -import indirectSchemas from './get-toc-items--indirect.fixture.json'; - -const minFraudImportPathMap = createImportPathMap( - `${process.cwd()}/content/minfraud/api-documentation/_schemas` -); - -describe('getTocItems()', () => { - it('works with direct `Schema` component usage', async () => { - const mdast = ( - directSchemas as any - ).data.allMdx.nodes[0].customTableOfContents; - - const toc = generateTableOfContents(mdast, minFraudImportPathMap); - - const expected = { - items: [ - { - items: [ - { - title: 'Level 1a - Link 1', - url: '#schema--level-1a---link-1', - }, - { - items: [ - { - title: 'Level 2a - Link 1', - url: '#schema--level-2a---link-1', - }, - { - title: 'Level 2a - Link 2', - url: '#schema--level-2a---link-2', - }, - ], - title: 'Level 2a', - url: '#level-2a', - }, - { - items: [ - { - title: 'Level 2b - Link 1', - url: '#schema--level-2b---link-1', - }, - { - title: 'Level 2b - Link 2', - url: '#schema--level-2b---link-2', - }, - ], - title: 'Level 2b', - url: '#level-2b', - }, - ], - title: 'Level 1a', - url: '#level-1a', - }, - { - items: [ - { - title: 'Level 1b - Link 1', - url: '#schema--level-1b---link-1', - }, - ], - title: 'Level 1b', - url: '#level-1b', - }, - ], - }; - - expect(toc).toEqual(expected); - }); - - it('works with indirect `Schema` component usage', async () => { - const mdast = (indirectSchemas as any) - .data.allMdx.nodes[0].customTableOfContents; - - const toc = generateTableOfContents(mdast, minFraudImportPathMap); - - const expected = { - items: [ - { - title: 'Authorization and Security', - url: '#authorization-and-security', - }, - { - title: 'Service Endpoints', - url: '#service-endpoints', - }, - { - title: 'Headers', - url: '#headers', - }, - { - title: 'Bodies', - url: '#bodies', - }, - { - items: [ - { - title: 'Request', - url: '#schema--request', - }, - { - title: 'Request › Device', - url: '#schema--request--device', - }, - { - title: 'Request › Event', - url: '#schema--request--event', - }, - { - title: 'Request › Account', - url: '#schema--request--account', - }, - { - title: 'Request › Email', - url: '#schema--request--email', - }, - { - title: 'Request › Billing', - url: '#schema--request--billing', - }, - { - title: 'Request › Shipping', - url: '#schema--request--shipping', - }, - { - title: 'Request › Payment', - url: '#schema--request--payment', - }, - { - title: 'Request › Credit Card', - url: '#schema--request--credit-card', - }, - { - title: 'Request › Order', - url: '#schema--request--order', - }, - { - title: 'Request › Shopping Cart', - url: '#schema--request--shopping-cart', - }, - { - title: 'Request › Shopping Cart › Item', - url: '#schema--request--shopping-cart--item', - }, - { - title: 'Request › Custom Inputs', - url: '#schema--request--custom-inputs', - }, - ], - title: 'Object Reference', - url: '#object-reference', - }, - ], - }; - - expect(toc).toEqual(expected); - }); -}); diff --git a/src/utils/get-toc-items.ts b/src/utils/get-toc-items.ts deleted file mode 100644 index ccbdd578d..000000000 --- a/src/utils/get-toc-items.ts +++ /dev/null @@ -1,153 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -// eslint-disable-next-line import/no-unresolved -import { Parent } from 'unist'; - -/* eslint-disable @typescript-eslint/no-var-requires */ -// eslint-disable-next-line max-len -const getTableOfContents = require('gatsby-plugin-mdx/utils/get-table-of-content'); -const generateTOC = require('mdast-util-toc'); -const parse = require('remark-parse'); -const mdx = require('remark-mdx'); -const stringify = require('remark-stringify'); -const unified = require('unified'); -const map = require('unist-util-map'); -const find = require('unist-util-find'); -const findBefore = require('unist-util-find-before'); -const visitParents = require('unist-util-visit-parents'); - -/** - * To get the add `Schema` component names to the table of contents, the - * abstract syntax tree (AST) needs to be modified so that `mdast-util-toc` - * and `gatsby-plugin-mdx/utils/get-table-of-content` think `Schema` nodes are - * heading nodes. - * - * This code searches for AST nodes of direct `Schema` usage (node name of - * `Schema`) or indirect Schema usage (node name of `Schemas.*`), gets the - * `name` attribute value, and then replaces the node with a heading node that - * is one deeper than the closest heading. - */ - -/* eslint-disable security/detect-non-literal-fs-filename */ -export const createImportPathMap = ( - schemaDir: string -): Record => - fs.readdirSync(schemaDir).reduce((acc, file) => { - if (fs.lstatSync(path.resolve(schemaDir, file)).isDirectory()) { - return acc; - } - - return { - ...acc, - [`Schemas.${path.basename(file, '.mdx')}`]: path.resolve( - schemaDir, - file - ), - }; - }, {}); -/* eslint-enable security/detect-non-literal-fs-filename */ - -export default ( - sourceTree: any, - importPathMap: Record, -): any => { - const newTree = map( - sourceTree, - (node: any) => { - if ( - node.type !== 'mdxBlockElement' - || !(node.name as string).startsWith('Schema') - ) { - return node; - } - - let schemaNode: any = node; - - /** - * Schema component instances can either be used directly in an MDX file, - * or indirectly via an imported MDX file. Indirect instances require - * additional processing to find the imported MDX file and create it's own - * abstract syntax tree. - * - */ - if ((node.name as string).startsWith('Schemas')) { - const importedComponentName = node.name as string; - - // eslint-disable-next-line security/detect-object-injection - const importedFilePath = importPathMap[importedComponentName]; - - if (importedFilePath) { - let importedComponentTree; - - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileContents = fs.readFileSync(importedFilePath); - - unified() - .use(parse, { - position: false, - }) - .use(stringify) - .use(mdx) - .use(() => (node: any) => { - importedComponentTree = node; - }) - .processSync(fileContents); - - if (importedComponentTree) { - const foundNode = find( - importedComponentTree, - (node: any) => node.name - && (node.name as string).endsWith('Schema') - ); - - if (foundNode) { - schemaNode = foundNode; - } - } - } - } - - const schemaHeadingName = (schemaNode as any).attributes.find( - (attr: any) => attr.name === 'name' - )?.value; - - if (!schemaHeadingName) { - return; - } - - let closestHeadingNode; - - visitParents( - sourceTree, - node, - (node: any, ancestors: Parent[]) => { - ancestors.forEach((ancestor: Parent) => { - closestHeadingNode = findBefore(ancestor, node, 'heading'); - }); - } - ); - - node = { - ...node, - data: { - hProperties: { - id: `schema--${schemaHeadingName}`, - }, - }, - depth: closestHeadingNode ? (closestHeadingNode as any).depth + 1 : 1, - type: 'heading', - value: schemaHeadingName.split(' | ') - .map((part: string) => part.trim()) - .join(' › '), - }; - - return node; - } - ); - - const toc = generateTOC(newTree, { - maxDepth: 6, - }); - - return getTableOfContents(toc.map, {}); -}; diff --git a/src/utils/json.spec.ts b/src/utils/json.spec.ts deleted file mode 100644 index 1a8e558be..000000000 --- a/src/utils/json.spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { - inferType, - isArray, - isBoolean, - isNumber, - isObject, - isString, -} from './json'; - -describe('json utils', () => { - describe('isArray()', () => { - it('returns `true` if value is an array', () => { - expect(isArray([])).toBe(true); - }); - - describe('returns `false` when', () => { - it('value is null', () => { - expect(isArray(null)).toBe(false); - }); - - it('value is a string', () => { - expect(isArray('')).toBe(false); - }); - - it('value is a boolean', () => { - expect(isArray(true)).toBe(false); - }); - - it('value is a number', () => { - expect(isArray(1)).toBe(false); - }); - - it('value is a object', () => { - expect(isArray({})).toBe(false); - }); - - }); - }); - - describe('isBoolean()', () => { - it('returns `true` if value is a boolean', () => { - expect(isBoolean(true)).toBe(true); - expect(isBoolean(false)).toBe(true); - }); - - describe('returns `false` when', () => { - it('value is null', () => { - expect(isBoolean(null)).toBe(false); - }); - - it('value is a string', () => { - expect(isBoolean('')).toBe(false); - }); - - it('value is a number', () => { - expect(isBoolean(1)).toBe(false); - }); - - it('value is a object', () => { - expect(isBoolean({})).toBe(false); - }); - - it('value is an array', () => { - expect(isBoolean([])).toBe(false); - }); - }); - }); - - describe('isNumber()', () => { - it('returns `true` if value is a number', () => { - expect(isNumber(0)).toBe(true); - expect(isNumber(1)).toBe(true); - expect(isNumber(1.1)).toBe(true); - }); - - describe('returns `false` when', () => { - it('value is null', () => { - expect(isNumber(null)).toBe(false); - }); - - it('value is a string', () => { - expect(isNumber('')).toBe(false); - }); - - it('value is a boolean', () => { - expect(isNumber(true)).toBe(false); - }); - - it('value is an object', () => { - expect(isNumber({})).toBe(false); - }); - - it('value is an array', () => { - expect(isNumber([])).toBe(false); - }); - }); - }); - - describe('isObject()', () => { - it('returns `true` if value is a boolean', () => { - expect(isObject({})).toBe(true); - }); - - describe('returns `false` when', () => { - it('value is null', () => { - expect(isObject(null)).toBe(false); - }); - - it('value is a string', () => { - expect(isObject('')).toBe(false); - }); - - it('value is a number', () => { - expect(isObject(1)).toBe(false); - }); - - it('value is a boolean', () => { - expect(isObject(false)).toBe(false); - }); - - it('value is an array', () => { - expect(isObject([])).toBe(false); - }); - }); - }); - - describe('isString()', () => { - it('returns `true` if value is a string', () => { - expect(isString('')).toBe(true); - }); - - describe('returns `false` when', () => { - it('value is null', () => { - expect(isString(null)).toBe(false); - }); - - it('value is a number', () => { - expect(isString(1)).toBe(false); - }); - - it('value is a boolean', () => { - expect(isString(false)).toBe(false); - }); - - it('value is an object', () => { - expect(isString({})).toBe(false); - }); - - it('value is an array', () => { - expect(isString([])).toBe(false); - }); - }); - }); - - describe('inferType()', () => { - it('returns `array` when given an array', () => { - expect(inferType([])).toBe('array'); - }); - - it('returns `boolean` when given an boolean', () => { - expect(inferType(true)).toBe('boolean'); - }); - - it('returns `number` when given a number', () => { - expect(inferType(1)).toBe('number'); - }); - - it('returns `object` when given an object', () => { - expect(inferType({})).toBe('object'); - }); - - it('returns `string` when given a string', () => { - expect(inferType('')).toBe('string'); - }); - - it('throws an error if a type cannot be inferred', () => { - const spy = jest.spyOn(console, 'error').mockImplementation(); - - expect(() => inferType(null)).toThrowError( - // eslint-disable-next-line max-len - 'Cannot infer type from value. See console error labeled: `Invalid Type`' - ); - - expect(console.error).toHaveBeenLastCalledWith('Invalid Type', null); - - spy.mockRestore(); - }); - }); -}); - - diff --git a/src/utils/json.ts b/src/utils/json.ts deleted file mode 100644 index 2041b0337..000000000 --- a/src/utils/json.ts +++ /dev/null @@ -1,51 +0,0 @@ -import _isBoolean from 'lodash.isboolean'; -import _isNumber from 'lodash.isnumber'; -import isPlainObject from 'lodash.isplainobject'; - -export const isArray = ( - value: Json -): value is IJsonArray => Array.isArray(value); - -export const isBoolean = ( - value: Json -): value is boolean => _isBoolean(value); - -export const isNumber = ( - value: Json -): value is number => _isNumber(value); - -export const isObject = ( - value: Json -): value is IJsonObject => isPlainObject(value); - -export const isString = ( - value: Json -): value is string => typeof value === 'string'; - -export const inferType = (value: Json): string => { - if (isArray(value)) { - return 'array'; - } - - if (isBoolean(value)) { - return 'boolean'; - } - - if (isObject(value)) { - return 'object'; - } - - if (isNumber(value)) { - return 'number'; - } - - if (isString(value)) { - return 'string'; - } - - console.error('Invalid Type', value); - - throw new Error( - 'Cannot infer type from value. See console error labeled: `Invalid Type`' - ); -}; diff --git a/src/utils/markdown.tsx b/src/utils/markdown.tsx deleted file mode 100644 index 2b2b970ab..000000000 --- a/src/utils/markdown.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { MDXProvider } from '@mdx-js/react'; -import MDX from '@mdx-js/runtime'; -import React from 'react'; - -import * as components from '../components/Mdx'; - -export const renderMarkdown = ( - content: any -): React.ReactElement => { - return ( - /* eslint-disable-next-line max-len */ - /* @ts-expect-error: @type for @mdx-js/react has implicit children which is incompat with react 18 */ - - - {content} - - - ); -}; diff --git a/src/utils/openapi.spec.ts b/src/utils/openapi.spec.ts deleted file mode 100644 index 3f54a710c..000000000 --- a/src/utils/openapi.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { OpenAPIV3 } from 'openapi-types'; - -import { - formatSchemaName, - isArraySchemaObject, - isDocumentObject, - isNonArraySchemaObject, - isReferenceObject, - isSchemaObject, -} from './openapi'; - -describe('formatSchemaName()', () => { - describe( - 'replaces `|` with `›`, ensuring proper spacing before and after', - () => { - it.each([ - [ - 'foo', - 'foo', - ], - [ - ' foo ', - 'foo', - ], - [ - 'foo |', - 'foo |', - ], - [ - 'foo | bar', - 'foo › bar', - ], - ])('given `%s`, returns `%s`', (given: string, expected: string) => { - expect(formatSchemaName(given)).toBe(expected); - }); - } - ); -}); - -describe('isArraySchemaObject()', () => { - it('array type schema objects return true', () => { - const obj: OpenAPIV3.SchemaObject = { - items: { - type: 'string', - }, - type: 'array', - }; - expect(isArraySchemaObject(obj)).toBe(true); - }); - - it('non-array type schema objects return false', () => { - const obj: OpenAPIV3.SchemaObject = { - type: 'string', - }; - expect(isArraySchemaObject(obj)).toBe(false); - }); -}); - -describe('isDocumentObject()', () => { - it('document objects return true', () => { - const obj: OpenAPIV3.Document = { - info: { - title: '', - version: '', - }, - openapi: '', - paths: {}, - }; - expect(isDocumentObject(obj)).toBe(true); - }); - - it('non-document objects return false', () => { - const obj: OpenAPIV3.SchemaObject = { - type: 'string', - }; - expect(isDocumentObject(obj)).toBe(false); - }); -}); - -describe('isNonArraySchemaObject', () => { - it('array type schema objects return false', () => { - const obj: OpenAPIV3.SchemaObject = { - items: { - type: 'string', - }, - type: 'array', - }; - expect(isNonArraySchemaObject(obj)).toBe(false); - }); - - it('non-array type schema objects return true', () => { - const obj: OpenAPIV3.NonArraySchemaObject = { - type: 'string', - }; - expect(isNonArraySchemaObject(obj)).toBe(true); - }); -}); - -describe('isReferenceObject()', () => { - it('objects containing a `$ref` property are reference objects', () => { - const obj: OpenAPIV3.ReferenceObject = { - $ref: '', - }; - expect(isReferenceObject(obj)).toBe(true); - }); - - it( - 'objects that don\'t contain a `$ref` property are not reference objects', - () => { - const obj: OpenAPIV3.SchemaObject = {}; - expect(isReferenceObject(obj)).toBe(false); - } - ); -}); - -describe('isSchemaObject()', () => { - it('document objects are not schema objects', () => { - const obj: OpenAPIV3.Document = { - info: { - title: '', - version: '', - }, - openapi: '', - paths: {}, - }; - expect(isSchemaObject(obj)).toBe(false); - }); - - it('reference objects are not schema objects', () => { - const obj: OpenAPIV3.ReferenceObject = { - $ref: '', - }; - expect(isSchemaObject(obj)).toBe(false); - }); - - it('any non-reference, non-document objects are schema objects', () => { - const obj = {}; - expect(isSchemaObject(obj)).toBe(true); - }); -}); diff --git a/src/utils/openapi.ts b/src/utils/openapi.ts deleted file mode 100644 index 485ed7a8a..000000000 --- a/src/utils/openapi.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* eslint-disable no-prototype-builtins */ -import { OpenAPIV3 } from 'openapi-types'; - -export const formatSchemaName = (schemaPath: string): string => schemaPath - .split(' | ') - .map((part: string) => part.trim()) - .join(' › '); - -export const isReferenceObject = ( - obj: OpenAPIV3.Document - | OpenAPIV3.SchemaObject - | OpenAPIV3.ReferenceObject -): obj is OpenAPIV3.ReferenceObject => obj.hasOwnProperty('$ref'); - -export const isDocumentObject = ( - obj: OpenAPIV3.Document - | OpenAPIV3.SchemaObject - | OpenAPIV3.ReferenceObject -): obj is OpenAPIV3.Document => obj.hasOwnProperty('openapi'); - -export const isSchemaObject = ( - obj: OpenAPIV3.Document - | OpenAPIV3.SchemaObject - | OpenAPIV3.ReferenceObject -): obj is OpenAPIV3.SchemaObject => !isReferenceObject(obj) - && !isDocumentObject(obj); - -export const isArraySchemaObject = ( - obj: OpenAPIV3.SchemaObject -): obj is OpenAPIV3.ArraySchemaObject => isSchemaObject(obj) - && obj.type === 'array'; - -export const isNonArraySchemaObject = ( - obj: OpenAPIV3.SchemaObject -): obj is OpenAPIV3.NonArraySchemaObject => !isArraySchemaObject(obj); diff --git a/src/utils/pagination.spec.ts b/src/utils/pagination.spec.ts deleted file mode 100644 index f2ba49d0b..000000000 --- a/src/utils/pagination.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { getNextPage, getPreviousPage } from './pagination'; - -jest.mock('../../content/navigation', () => ([ - { - to: 'foo', - }, - { - items: [ - { - to: 'bar-item-foo', - }, - { - to: 'bar-item-bar', - }, - ], - to: 'bar', - }, - { - url: '#', - }, - { - items: [ - { - to: 'baz-item-foo', - }, - { - to: 'baz-item-bar', - }, - ], - secondaryItems: [ - { - to: 'baz-secondary-foo', - }, - { - to: 'baz-secondary-bar', - }, - ], - to: 'baz', - }, -])); - -describe('pagination', () => { - describe('getPreviousPage()', () => { - it('returns previous page', () => { - expect(getPreviousPage('bar')).toHaveProperty('to', 'foo'); - }); - - it('returns previous page when current url ends with a slash', () => { - expect(getPreviousPage('bar/')).toHaveProperty('to', 'foo'); - }); - - it('returns nothing if previous page does not exist', () => { - expect(getPreviousPage('foo')).toBeUndefined; - }); - - it('skips non-internal nodes', () => { - expect(getPreviousPage('baz')).toHaveProperty('to', 'bar-item-bar'); - }); - - it('considers `items` child pages', () => { - expect(getPreviousPage('baz')).toHaveProperty('to', 'bar-item-bar'); - }); - - it('considers `secondaryItems` child pages', () => { - expect(getPreviousPage('baz-secondary-bar')) - .toHaveProperty('to', 'baz-secondary-foo'); - }); - }); - - describe('getNextPage()', () => { - it('returns next page', () => { - expect(getNextPage('foo')).toHaveProperty('to', 'bar'); - }); - - it('returns nothing if next page does not exist', () => { - expect(getNextPage('baz-secondary-bar')).toBeUndefined(); - }); - - it('skips non-internal nodes', () => { - expect(getNextPage('bar-item-bar')).toHaveProperty('to', 'baz'); - }); - - it('considers `items` child pages', () => { - expect(getNextPage('bar')).toHaveProperty('to', 'bar-item-foo'); - }); - - it('considers `secondaryItems` child pages', () => { - expect(getNextPage('baz-item-bar')) - .toHaveProperty('to', 'baz-secondary-foo'); - }); - }); -}); diff --git a/src/utils/pagination.ts b/src/utils/pagination.ts deleted file mode 100644 index 4b6bb041e..000000000 --- a/src/utils/pagination.ts +++ /dev/null @@ -1,51 +0,0 @@ -import findIndex from 'lodash.findindex'; - -import navigation from '../../content/navigation'; -import { - IInternalItem, - IItem, - isInternalItem, -} from '../types/Item'; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const flattenDeep = (arr: any[]) : any[] => Array.isArray(arr) - ? arr.reduce( (a, b) => a.concat(flattenDeep(b)) , []) - : [ - arr, - ]; - -const flattenTree = (tree: IItem[]) : IInternalItem[] => flattenDeep( - tree.map((node: IItem) => { - if (!isInternalItem(node)) { - return []; - } - - return [ - node, - ...(node.items ? flattenTree(node?.items) : []), - ...(node.secondaryItems ? flattenTree(node?.secondaryItems) : []), - ]; - })); - -const flattenedNav = flattenTree(navigation); - -const findNodeIndex = (currentPath: string): number => findIndex( - flattenedNav, - (item: IInternalItem) => item.to === currentPath.replace(/\/$/, '') -); - -export const getPreviousPage = (currentPath: string): void | IInternalItem => { - const nodeIndex = findNodeIndex(currentPath); - - if (flattenedNav[nodeIndex - 1]) { - return flattenedNav[nodeIndex - 1]; - } -}; - -export const getNextPage = (currentPath: string): void | IInternalItem => { - const nodeIndex = findNodeIndex(currentPath); - - if (flattenedNav[nodeIndex + 1]) { - return flattenedNav[nodeIndex + 1]; - } -}; From 160edb7052266c55128f46baa910244c5fc9f740 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:33:47 -0400 Subject: [PATCH 16/24] Build site in hugo workflow --- .github/workflows/hugo.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index 53300e172..eb6029bf1 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -21,3 +21,6 @@ jobs: with: hugo-version: 'latest' extended: true + + - name: Build site + run: hugo From fc31a4f3487c49e840cb834371bc23eacb55b80d Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:38:35 -0400 Subject: [PATCH 17/24] Use dartsass --- .github/workflows/hugo.yml | 3 +++ layouts/partials/head.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml index eb6029bf1..931d86434 100644 --- a/.github/workflows/hugo.yml +++ b/.github/workflows/hugo.yml @@ -22,5 +22,8 @@ jobs: hugo-version: 'latest' extended: true + - name: Install Dart Sass + run: sudo snap install dart-sass + - name: Build site run: hugo diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 8e8be4a02..b33fcb00c 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -4,7 +4,7 @@ {{ .Title }} {{ $style := resources.Get "scss/index.scss" }} {{ $options := dict - "transpiler" "dartsass" }} {{ $style := $style | resources.ToCSS $options}} + "transpiler" "dartsass" }} {{ $style := $style | toCSS $options}} From 14b5916aa8633e5ce33c4505f34e2b14c677ab3b Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:42:38 -0400 Subject: [PATCH 18/24] Remove test.md --- content/test.md | 44 -------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 content/test.md diff --git a/content/test.md b/content/test.md deleted file mode 100644 index 96ac6a9df..000000000 --- a/content/test.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -draft: false -title: MaxMind Dev Site -keywords: - - MaxMind developer documentation -description: > - This site provides API documentation for MaxMind's web services and - downloadable databases. ---- - - -{{< codeset >}} -```js -console.log('hello'); -``` - -```go -fmt.Println("hello") -``` - -```php -Hello World

    '; ?> -``` -{{< /codeset >}} - -{{< codeset >}} -```php -Hello World

    '; ?> -``` - -```csharp -System.Console.WriteLine("Hello, World!"); -``` -{{< /codeset >}} - -{{< codeset >}} -```js -console.log('hello'); -``` - -```go -fmt.Println("hello") -``` -{{< /codeset >}} From ac5eebb2c0204373aa2cd79493bddc04ce5305c5 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:45:18 -0400 Subject: [PATCH 19/24] Clean up old gatsby and firebase files --- .browserslistrc | 5 - .eslintignore | 5 - .eslintrc.js | 364 --------------------------------- .firebaserc | 5 - .jestrc.e2e.js | 21 -- .jestrc.js | 37 ---- .postcssrc.js | 12 -- .prettierrc | 1 - .stylelintrc.js | 164 --------------- bin/find-recent-404s.mjs | 18 -- bin/get-checksums-of-files.mjs | 38 ---- bin/sitemap-query-string.js | 16 -- firebase/headers.js | 165 --------------- 13 files changed, 851 deletions(-) delete mode 100644 .browserslistrc delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 .firebaserc delete mode 100644 .jestrc.e2e.js delete mode 100644 .jestrc.js delete mode 100644 .postcssrc.js delete mode 100644 .prettierrc delete mode 100644 .stylelintrc.js delete mode 100644 bin/find-recent-404s.mjs delete mode 100644 bin/get-checksums-of-files.mjs delete mode 100644 bin/sitemap-query-string.js delete mode 100644 firebase/headers.js diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index a70c4c0a7..000000000 --- a/.browserslistrc +++ /dev/null @@ -1,5 +0,0 @@ -last 2 Chrome versions -last 2 Edge versions -last 2 Firefox versions -last 2 Safari versions -Firefox ESR diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 1e26c8965..000000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -.cache -.firebase -node_modules -public -!.*rc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 1181b1265..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,364 +0,0 @@ -module.exports = { - env: { - browser: true, - es6: true, - node: true, - }, - extends: [ - 'eslint:recommended', - 'plugin:css-modules/recommended', - 'plugin:compat/recommended', - 'plugin:import/errors', - 'plugin:import/typescript', - 'plugin:import/warnings', - 'plugin:jsx-a11y/recommended', - 'plugin:react-hooks/recommended', - 'plugin:react/recommended', - 'plugin:security/recommended', - ], - globals: { - __BASE_PATH__: true, - __PATH_PREFIX__: true, - graphql: true, - }, - ignorePatterns: [ - '**/_examples/*.ts*', - '**/_schemas/*.ts*', - '**/__mocks__/*', - '**/*.mdx', - '.cache', - 'node_modules', - 'public', - ], - overrides: [ - { - extends: [ - 'plugin:json/recommended', - ], - files: [ - '**/*.json', - ], - rules: { - 'comma-dangle': [ - 'warn', - 'never', - ], - 'quote-props': [ - 'warn', - 'always', - ], - quotes: [ - 'warn', - 'double', - ], - semi: [ - 'warn', - 'never', - ], - }, - }, - { - files: [ - 'content/**', - ], - rules: { - 'filenames/match-exported': [ - 0, - ], - 'filenames/match-regex': [ - 1, - '^[a-z0-9-]+$', - ], - 'max-len': [ - 0, - ], - }, - }, - { - extends: [ - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - ], - files: [ - '**/*.{ts,tsx}', - ], - parser: '@typescript-eslint/parser', - parserOptions: { - project: [ - 'tsconfig.json', - ], - }, - rules: { - '@typescript-eslint/await-thenable': 'error', - '@typescript-eslint/naming-convention': [ - 'error', - { - custom: { - match: true, - regex: '^I[A-Z]', - }, - format: [ - 'PascalCase', - ], - selector: 'interface', - }, - ], - 'typescript-sort-keys/interface': 1, - 'typescript-sort-keys/string-enum': 1, - }, - settings: { - 'import/parsers': { - '@typescript-eslint/parser': [ - '.ts', - '.tsx', - ], - }, - }, - }, - { - files: [ - 'src/pages/**', - ], - rules: { - 'filenames/match-exported': [ - 0, - ], - 'filenames/match-regex': [ - 1, - '^[a-z0-9-]+$', - ], - }, - }, - ], - parser: '@babel/eslint-parser', - parserOptions: { - ecmaFeatures: { - modules: true, - }, - ecmaVersion: 6, - requireConfigFile: false, - sourceType: 'module', - }, - plugins: [ - '@typescript-eslint', - 'css-modules', - 'filenames', - 'json', - 'jsx-a11y', - 'react', - 'security', - 'simple-import-sort', - 'sort-keys-fix', - 'typescript-sort-keys', - ], - root: true, - rules: { - 'array-bracket-newline': [ - 'warn', - { - minItems: 1, - multiline: true, - }, - ], - 'array-element-newline': [ - 'warn', - 'always', - ], - 'comma-dangle': [ - 'warn', - 'always-multiline', - ], - 'css-modules/no-undef-class': [ - 1, - { - camelCase: true, - }, - ], - 'css-modules/no-unused-class': [ - 1, - { - camelCase: true, - }, - ], - 'eol-last': [ - 'warn', - 'always', - ], - 'filenames/match-exported': [ - 1, - 'pascal', - ], - indent: [ - 'warn', - 2, - ], - 'max-len': [ - 'warn', - { - code: 80, - }, - ], - 'no-trailing-spaces': 'warn', - 'object-curly-newline': [ - 'warn', - { - ExportDeclaration: 'never', - ImportDeclaration: { - multiline: true, - }, - ObjectExpression: { - minProperties: 1, - multiline: true, - }, - ObjectPattern: { - multiline: true, - }, - }, - ], - 'object-curly-spacing': [ - 'warn', - 'always', - { - objectsInObjects: false, - }, - ], - 'object-property-newline': 'warn', - 'quote-props': [ - 'warn', - 'as-needed', - ], - quotes: [ - 'error', - 'single', - ], - 'react-hooks/exhaustive-deps': 'warn', - 'react-hooks/rules-of-hooks': 'error', - 'react/boolean-prop-naming': [ - 'warn', - { - rule: '^(is|has)[A-Z]([A-Za-z0-9]?)+', - }, - ], - 'react/forbid-component-props': [ - 1, - { - forbid: [ - 'style', - ], - }, - ], - 'react/forbid-dom-props': [ - 1, - { - forbid: [ - 'style', - ], - }, - ], - 'react/jsx-closing-bracket-location': [ - 1, - 'tag-aligned', - ], - 'react/jsx-closing-tag-location': [ - 1, - { - nonEmpty: 'after-props', - selfClosing: 'tag-aligned', - }, - ], - 'react/jsx-first-prop-new-line': [ - 1, - 'always', - ], - 'react/jsx-indent': [ - 1, - 2, - { - checkAttributes: true, - }, - ], - 'react/jsx-indent-props': [ - 1, - 2, - ], - 'react/jsx-max-props-per-line': [ - 1, - { - when: 'always', - }, - ], - 'react/jsx-one-expression-per-line': [ - 1, - { - allow: 'single-child', - }, - ], - 'react/jsx-sort-props': [ - 1, - ], - 'react/jsx-wrap-multilines': [ - 1, - { - arrow: 'parens-new-line', - assignment: 'parens-new-line', - condition: 'ignore', - declaration: 'parens-new-line', - logical: 'ignore', - prop: 'ignore', - return: 'parens-new-line', - }, - ], - semi: [ - 1, - 'always', - ], - 'simple-import-sort/imports': [ - 'warn', - { - // eslint-disable-next-line max-len - // https://github.com/lydell/eslint-plugin-simple-import-sort#custom-grouping - groups: [ - [ - '^\\u0000', - ], - [ - '^@?\\w', - ], - [ - '^', - ], - [ - '^\\.', - ], - [ - '\\.module\\.scss$', - ], - ], - }, - ], - 'sort-keys': [ - 'warn', - ], - 'sort-keys-fix/sort-keys-fix': 'warn', - }, - settings: { - 'import/parsers': { - '@typescript-eslint/parser': [ - '.ts', - '.tsx', - ], - }, - polyfills: [ - 'CustomEvent', - 'fetch', - 'IntersectionObserver', - 'Promise.all', - 'Promise.race', - 'Promise.resolve', - 'URLSearchParams', - ], - react: { - version: 'detect', - }, - }, -}; diff --git a/.firebaserc b/.firebaserc deleted file mode 100644 index 6d6b04d9e..000000000 --- a/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "mm-dev-site-staging" - } -} diff --git a/.jestrc.e2e.js b/.jestrc.e2e.js deleted file mode 100644 index c90e64d1c..000000000 --- a/.jestrc.e2e.js +++ /dev/null @@ -1,21 +0,0 @@ -const baseJestConfig = require('./.jestrc'); - -module.exports = { - ...baseJestConfig, - globalSetup: 'test/global-setup.e2e.ts', - globalTeardown: 'test/global-teardown.e2e.ts', - setupFilesAfterEnv: [ - 'test/matchers/toHaveNoBrokenLinks.ts', - ], - testEnvironment: 'node', - testMatch: [ - 'test/e2e/*.spec.ts' - ], - testPathIgnorePatterns: [ - 'node_modules', - '\\.cache', - '.*/public', - '/test/regressions.spec.ts', - 'test/e2e', - ], -}; diff --git a/.jestrc.js b/.jestrc.js deleted file mode 100644 index 1fb3fee61..000000000 --- a/.jestrc.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = { - globals: { - __PATH_PREFIX__: '', - }, - moduleNameMapper: { - '.+\\.(css|styl|less)$': 'identity-obj-proxy', - // eslint-disable-next-line max-len - '.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/__mocks__/file-mock.ts', - - '.+\\.scss$': '/test/identity-obj-proxy-esm.js', - // eslint-disable-next-line max-len - '^gatsby-page-utils/(.*)$': 'gatsby-page-utils/$1', // Workaround for https://github.com/facebook/jest/issues/9771 - }, - setupFiles: [ - '/test/loadershim.tsx', - ], - setupFilesAfterEnv: [ - './test/setup.ts', - ], - testEnvironment: 'jsdom', - testEnvironmentOptions: { - url: 'http://localhost', - }, - testPathIgnorePatterns: [ - 'node_modules', - '\\.cache', - '.*/public', - '/test', - ], - transform: { - '^.+\\.[jt]s(x)?$': '/test/preprocess.js', - }, - transformIgnorePatterns: [ - // eslint-disable-next-line max-len - 'node_modules/(?!(ccount|character-entities-html4|character-entities-legacy|comma-separated-tokens|data-uri-to-buffer|fetch-blob|formdata-polyfill|gatsby-link|gatsby-script|hast-util-is-element|hast-util-sanitize|hast-util-to-html|hast-util-whitespace|html-void-elements|linkinator|mdast-util-definitions|mdast-util-to-hast|micromark-util-character|micromark-util-encode|micromark-util-sanitize-uri|node-fetch|property-information|remark-html|space-separated-tokens|srcset|stringify-entities|trim-lines|typeface-montserrat|unist-builder|unist-util-generated|unist-util-is|unist-util-position|unist-util-visit|unist-util-visit-parents)/)', - ], -}; diff --git a/.postcssrc.js b/.postcssrc.js deleted file mode 100644 index bfa01a896..000000000 --- a/.postcssrc.js +++ /dev/null @@ -1,12 +0,0 @@ -const postcssPresetEnv = require('postcss-preset-env'); - -module.exports = { - plugins: [ - postcssPresetEnv({ - autoprefixer: { - grid: 'autoplace', - }, - stage: 0, - }), - ], -}; diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 017696922..000000000 --- a/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -singleQuote: true diff --git a/.stylelintrc.js b/.stylelintrc.js deleted file mode 100644 index 2009681a1..000000000 --- a/.stylelintrc.js +++ /dev/null @@ -1,164 +0,0 @@ -const path = require('path'); - -module.exports = { - configBasedir: path.resolve(__dirname), - defaultSeverity: 'warning', - extends: [ - 'stylelint-config-recommended', - 'stylelint-config-sass-guidelines', - ], - plugins: [ - 'stylelint-no-unsupported-browser-features', - 'stylelint-order', - ], - rules: { - 'max-nesting-depth': 4, - 'order/order': [ - 'custom-properties', - 'declarations', - ], - 'order/properties-alphabetical-order': true, - 'plugin/no-unsupported-browser-features': [ - true, - { - ignore: [ - /** - * Partial support - IE11 - * - * Partial support in IE11 refers to calc not working properly - * with various use cases mentioned in known issues - * - * https://caniuse.com/calc - */ - 'calc', - - /** - * Not supported - IE 11 - * Partial support - Safari - * - * https://caniuse.com/?search=appearance - */ - 'css-appearance', - - /** - * Not supported - IE11 - * - * https://caniuse.com/?search=css-featurequeries - */ - 'css-featurequeries', - - /** - * Not supported - IE11 - * - * https://caniuse.com/?search=css%20filters - */ - 'css-filters', - - /** - * Partial support - Safari - * - * Partial support in Safari and Older Firefox versions refers to - * not using premultiplied colors which results in unexpected - * behavior when using the transparent keyword as advised by the - * spec. - * - * https://caniuse.com/?search=css-gradients - */ - 'css-gradients', - - /** - * Not supported - IE11 - * - * https://caniuse.com/?search=css-initial-value - */ - 'css-initial-value', - - /** - * False positive - */ - 'css-nesting', - - /** - * Not supported - IE11 - * - * Partial support - Chromium - * - * Supported on th elements, but not thead or tr - * - * Partial support - Firefox - * - * Not supported on any table parts - * - * https://caniuse.com/?search=css-sticky - */ - 'css-sticky', - - /** - * Partial support - IE11 - * - * Partial support is due to large amount of bugs present. - * - * https://caniuse.com/?search=flexbox - */ - 'flexbox', - - /** - * Partial support - Chromium, Firefox - * - * Partial support refers to not supporting the avoid-column, - * column, and avoid (in the column context) values for the - * properties break-before, break-after, and break-inside. - * - * https://caniuse.com/?search=multicolumn - */ - 'multicolumn', - - /** - * Partial support - IE11 - * - * Supports the value of invert for outline-color. - * Does not support outline-offset. - * - * https://caniuse.com/?search=outline - */ - 'outline', - - /** - * Partial support - IE11 - * - * Partial support in IE refers to not supporting the - * `transform-style: preserve-3d` property. This prevents nesting 3D - * transformed elements. - * - * https://caniuse.com/?search=transforms3d - */ - 'transforms3d', - - /** - * Partial support - IE11 - * - * Partial support refers to not supporting the "vmax" unit. - * - * https://caniuse.com/viewport-units - */ - 'viewport-units', - ], - }, - ], - 'selector-class-pattern': [ - '[a-z]([a-zA-Z0-9]+)?$', - { - resolveNestedSelectors: true, - }, - ], - 'selector-max-compound-selectors': 5, - 'selector-pseudo-class-no-unknown': [ - true, - { - ignorePseudoClasses: [ - 'global', - ], - }, - ], - }, -}; diff --git a/bin/find-recent-404s.mjs b/bin/find-recent-404s.mjs deleted file mode 100644 index 7bd2ca86a..000000000 --- a/bin/find-recent-404s.mjs +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable security/detect-non-literal-fs-filename */ -import fs from 'fs'; -import path from 'path'; - -const logFile = path.resolve('./.tmp/logs.json'); - -const logsBuffer = fs.readFileSync(logFile); - -const logs = JSON.parse(logsBuffer); - -const recent404s = logs - .map(log => log.httpRequest.requestUrl.replace( - 'https://dev.maxmind.com', - 'http://localhost:5000' - )) - .filter((log, index, logs) => logs.indexOf(log) === index); - -console.log(recent404s); diff --git a/bin/get-checksums-of-files.mjs b/bin/get-checksums-of-files.mjs deleted file mode 100644 index 38559b380..000000000 --- a/bin/get-checksums-of-files.mjs +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable compat/compat */ -/* eslint-disable security/detect-non-literal-fs-filename */ -import crypto from 'crypto'; -import fs from 'fs'; -import path from 'path'; - -const { TARGET_DIR } = process.env; - -const targetDir = path.resolve(TARGET_DIR); - -const getFiles = (dir, paths = []) =>{ - const files = fs.readdirSync(dir); - - files.forEach(file => { - const name = `${dir}/${file}`; - fs.statSync(name).isDirectory() ? getFiles(name, paths) : paths.push(name); - }); - - return paths; -}; - -const checksumFile = (path) => new Promise((resolve, reject) => { - const hash = crypto.createHash('sha1'); - const stream = fs.createReadStream(path); - stream.on('error', err => reject(err)); - stream.on('data', chunk => hash.update(chunk)); - stream.on('end', () => resolve(hash.digest('hex'))); -}); - -const promises = getFiles(targetDir) - .map(async(file) => ({ - checksum: await checksumFile(file), - uriPath: file.replace(targetDir, ''), - })); - -Promise.all(promises).then(fileChecksums => { - console.log(fileChecksums); -}); diff --git a/bin/sitemap-query-string.js b/bin/sitemap-query-string.js deleted file mode 100644 index e194390cf..000000000 --- a/bin/sitemap-query-string.js +++ /dev/null @@ -1,16 +0,0 @@ -const { existsSync, readFileSync, writeFileSync } = require('fs'); -const { resolve } = require('path'); - -const sitemapFile = resolve('./public/sitemap-pages.xml'); - -if (!existsSync(sitemapFile)) { - console.error(`ERROR: ${sitemapFile} not found.`); - process.exit(); -} - -const sitemapContents = readFileSync(sitemapFile, 'utf-8'); - -writeFileSync( - sitemapFile, - sitemapContents, -); diff --git a/firebase/headers.js b/firebase/headers.js deleted file mode 100644 index 2d394c314..000000000 --- a/firebase/headers.js +++ /dev/null @@ -1,165 +0,0 @@ -const cspKeywords = { - NONE: '\'none\'', - REPORT_SAMPLE: '\'report-sample\'', - SCRIPT: '\'script\'', - SELF: '\'self\'', - UNSAFE_INLINE: '\'unsafe-inline\'', -}; - -// https://www.google.com/supported_domains -// eslint-disable-next-line - const tldList = ['.google.com', '.google.ad', '.google.ae', '.google.com.af', '.google.com.ag', '.google.al', '.google.am', '.google.co.ao', '.google.com.ar', '.google.as', '.google.at', '.google.com.au', '.google.az', '.google.ba', '.google.com.bd', '.google.be', '.google.bf', '.google.bg', '.google.com.bh', '.google.bi', '.google.bj', '.google.com.bn', '.google.com.bo', '.google.com.br', '.google.bs', '.google.bt', '.google.co.bw', '.google.by', '.google.com.bz', '.google.ca', '.google.cd', '.google.cf', '.google.cg', '.google.ch', '.google.ci', '.google.co.ck', '.google.cl', '.google.cm', '.google.cn', '.google.com.co', '.google.co.cr', '.google.com.cu', '.google.cv', '.google.com.cy', '.google.cz', '.google.de', '.google.dj', '.google.dk', '.google.dm', '.google.com.do', '.google.dz', '.google.com.ec', '.google.ee', '.google.com.eg', '.google.es', '.google.com.et', '.google.fi', '.google.com.fj', '.google.fm', '.google.fr', '.google.ga', '.google.ge', '.google.gg', '.google.com.gh', '.google.com.gi', '.google.gl', '.google.gm', '.google.gr', '.google.com.gt', '.google.gy', '.google.com.hk', '.google.hn', '.google.hr', '.google.ht', '.google.hu', '.google.co.id', '.google.ie', '.google.co.il', '.google.im', '.google.co.in', '.google.iq', '.google.is', '.google.it', '.google.je', '.google.com.jm', '.google.jo', '.google.co.jp', '.google.co.ke', '.google.com.kh', '.google.ki', '.google.kg', '.google.co.kr', '.google.com.kw', '.google.kz', '.google.la', '.google.com.lb', '.google.li', '.google.lk', '.google.co.ls', '.google.lt', '.google.lu', '.google.lv', '.google.com.ly', '.google.co.ma', '.google.md', '.google.me', '.google.mg', '.google.mk', '.google.ml', '.google.com.mm', '.google.mn', '.google.com.mt', '.google.mu', '.google.mv', '.google.mw', '.google.com.mx', '.google.com.my', '.google.co.mz', '.google.com.na', '.google.com.ng', '.google.com.ni', '.google.ne', '.google.nl', '.google.no', '.google.com.np', '.google.nr', '.google.nu', '.google.co.nz', '.google.com.om', '.google.com.pa', '.google.com.pe', '.google.com.pg', '.google.com.ph', '.google.com.pk', '.google.pl', '.google.pn', '.google.com.pr', '.google.ps', '.google.pt', '.google.com.py', '.google.com.qa', '.google.ro', '.google.ru', '.google.rw', '.google.com.sa', '.google.com.sb', '.google.sc', '.google.se', '.google.com.sg', '.google.sh', '.google.si', '.google.sk', '.google.com.sl', '.google.sn', '.google.so', '.google.sm', '.google.sr', '.google.st', '.google.com.sv', '.google.td', '.google.tg', '.google.co.th', '.google.com.tj', '.google.tl', '.google.tm', '.google.tn', '.google.to', '.google.com.tr', '.google.tt', '.google.com.tw', '.google.co.tz', '.google.com.ua', '.google.co.ug', '.google.co.uk', '.google.com.uy', '.google.co.uz', '.google.com.vc', '.google.co.ve', '.google.co.vi', '.google.com.vn', '.google.vu', '.google.ws', '.google.rs', '.google.co.za', '.google.co.zm', '.google.co.zw', '.google.cat'] - -const updatedTldList = []; -tldList.map((item) => { - updatedTldList.push('https://*'.concat(item)); -}); - -module.exports = [ - { - headers: [ - { - key: 'Cache-Control', - value: 'max-age=0, no-cache', - }, - { - key: 'X-Content-Type-Options', - value: 'nosniff', - }, - { - key: 'X-Frame-Options', - value: 'DENY', - }, - { - key: 'X-XSS-Protection', - value: '1; mode=block', - }, - { - key: 'Referrer-Policy', - value: 'no-referrer', - }, - { - key: 'Expect-CT', - value: 'max-age=86400', - }, - { - key: 'Permissions-Policy', - value: [ - 'accelerometer', - 'autoplay', - 'camera', - 'document-domain', - 'encrypted-media', - 'fullscreen', - 'geolocation', - 'gyroscope', - 'magnetometer', - 'microphone', - 'midi', - 'payment', - 'picture-in-picture', - 'sync-xhr', - 'usb', - 'xr-spatial-tracking', - ].map(policy => `${policy}=()`).join(', '), - }, - { - key: 'Content-Security-Policy', - value: Object.entries({ - 'base-uri': [ - cspKeywords.SELF, - ], - 'connect-src': [ - cspKeywords.SELF, - 'status.maxmind.com', - 'www.googleapis.com', - 'https://www.maxmind.com', - - // HubSpot chat - // eslint-disable-next-line max-len - // https://knowledge.hubspot.com/domains-and-urls/ssl-and-domain-security-in-hubspot#content-security-policy - 'https://api.hubspot.com', - 'https://forms.hscollectedforms.net', - 'https://forms.hsforms.com', - - // eslint-disable-next-line max-len - // https://developers.google.com/tag-platform/security/guides/csp#google_analytics_4_google_analytics - 'https://*.google-analytics.com', - 'https://*.analytics.google.com', - 'https://*.googletagmanager.com', - 'https://*.g.doubleclick.net', - ].concat(updatedTldList), - 'default-src': [ - cspKeywords.SELF, - ], - 'font-src': [ - cspKeywords.SELF, - 'data:', - ], - 'form-action ': [ - cspKeywords.SELF, - ], - 'frame-src': [ - cspKeywords.SELF, - - // HubSpot chat - 'https://app.hubspot.com', - ], - 'img-src': [ - cspKeywords.SELF, - 'data:', - - // HubSpot chat - 'https://forms.hsforms.com', - 'https://track.hubspot.com', - ], - 'object-src': [ - cspKeywords.NONE, - ], - 'script-src': [ - cspKeywords.SELF, - cspKeywords.REPORT_SAMPLE, - cspKeywords.UNSAFE_INLINE, // Misc. inlined scripts 😕 - 'https://*.googletagmanager.com', - 'https://www.maxmind.com', - - // HubSpot chat - 'https://js.hs-scripts.com', - 'https://js.hs-analytics.net', - 'https://js.hscollectedforms.net', - 'https://js.hs-banner.com', - 'https://js.usemessages.com', - - // eslint-disable-next-line max-len - // https://developers.google.com/tag-platform/security/guides/csp#google_ads_conversions - 'https://www.googleadservices.com', - 'https://www.google.com', - ], - 'style-src': [ - cspKeywords.SELF, - cspKeywords.REPORT_SAMPLE, - cspKeywords.UNSAFE_INLINE, // HubSpot chat 😕 - ], - }) - .reduce((acc, [ - key, - values, - ]) => `${acc} ${key} ${values.join(' ')};`.trim(), ''), - }, - ], - source: '/**', - }, - { - headers: [ - { - key: 'Cache-Control', - value: 'public, max-age=604800, immutable', - }, - ], - source: `{${[ - '**/*.@(eot|otf|ttc|ttf|woff|woff2)', - '**/*.@(css|js)', - '**/*.@(jpg|jpeg|gif|png|svg)', - ].join(',')}}`, - }, -]; From 6692c51ca34e15dd64b62ef998267a565c718043 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 12:52:35 -0400 Subject: [PATCH 20/24] Fix static folder copy --- hugo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hugo.toml b/hugo.toml index da5892c4a..9fa34be60 100644 --- a/hugo.toml +++ b/hugo.toml @@ -225,6 +225,9 @@ title = 'MaxMind' weight = 40 [module] + [[module.mounts]] + source = "static" + target = "static" [[module.mounts]] source = "data/mm_ips.json" target = "static/maxmind-server-ip-addresses.json" From b2b9bdbf11eeda1c99636c3fe96e57d0bf18c7b4 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 13:22:32 -0400 Subject: [PATCH 21/24] Migrate geoip and minfraud landing pages --- content/geoip/_index.md | 182 ++++++++++++++++++++++++++++++++++++- content/minfraud/_index.md | 60 +++++++++++- 2 files changed, 238 insertions(+), 4 deletions(-) diff --git a/content/geoip/_index.md b/content/geoip/_index.md index af775cd48..3031501a8 100644 --- a/content/geoip/_index.md +++ b/content/geoip/_index.md @@ -1,7 +1,183 @@ --- draft: false -title: GeoIP and GeoLite +title: GeoIP and GeoLite2 --- -## TODO -MaxMind’s GeoIP2 and GeoLite2 IP intelligence products and services are used to discover information about a specific IP address. We provide free and paid web services, subscription-based downloadable databases, and free downloadable databases. +MaxMind’s GeoIP and GeoLite2 IP intelligence products and services are used to +discover information about a specific IP address. We provide free and paid web +services, subscription-based downloadable databases, and free downloadable +databases. + +## GeoIP Products and Services + +GeoIP IP intelligence products and services can provide data on geolocation, +network information, anonymizer status, and more. Learn about the different +kinds of +[geolocation data](https://support.maxmind.com/hc/en-us/articles/4407630528795-Choose-the-Right-Geolocation-Product) +and +[IP intelligence data](https://support.maxmind.com/hc/en-us/articles/4408200217371-Choose-the-IP-Intelligence-Data-you-Need) +in GeoIP products and services on our knowledge base. + +{{< rawhtml >}} +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Binary DatabaseCSV DatabaseWeb Service*
    City and Country + Docs + + Docs + + Docs +
    ISP + Docs + + Docs + + Included in GeoIP City Plus and Insights web services. +
    Domain + Docs + + Docs + + Included in GeoIP City Plus and Insights web services. +
    Connection Type + Docs + + Docs + + Comparable data included in the GeoIP Insights web service. +
    Enterprise + Docs + + Docs + + Comparable data included in the GeoIP Insights web service. +
    Anonymous + Docs + + Docs + + Included in the GeoIP Insights web service. +
    Insights** + • + + • + + Docs +
    + * GeoIP web services provide more accurate geolocation than our + equivalent databases. Learn more about the differences between GeoIP + web services and databases on our knowledge + base. +
    + ** The GeoIP Insights web service contains comparable + data to all of the databases and web services listed above. +
    +
    +{{}} + +## GeoLite Databases and Services + +GeoLite2 databases and web services provide free geolocation and limited network +data for IP addresses. This data is less accurate than the data in our paid, +GeoIP products and services. You must +[sign up for a free GeoLite2 account](https://www.maxmind.com/en/geolite2/signup) +in order to download GeoLite2 databases or query the GeoLite2 web services. +GeoLite2 uses the same integration methods and documentation as GeoIP (linked +below), with a few minor modifications. It is recommended that you get started +by [reading about GeoLite2](/geoip/geolite2-free-geolocation-data). + +{{< rawhtml >}} +
    + + + + + + + + + + + + + + + + + + + + + + + +
    Binary DatabaseCSV DatabaseWeb Service
    City and Country + Docs + + Docs + + Docs +
    ASN + Docs + + Docs + + Included in the GeoLite2 City Web Service. +
    +
    +{{}} diff --git a/content/minfraud/_index.md b/content/minfraud/_index.md index 8e1ec533a..826c9b1db 100644 --- a/content/minfraud/_index.md +++ b/content/minfraud/_index.md @@ -3,5 +3,63 @@ draft: false title: minFraud Web Services --- -## TODO +{{< alert info >}} +If you are a minFraud Legacy customer, please refer to our +[minFraud Legacy documentation](/minfraud/minfraud-legacy). + +If you are Proxy Detection Legacy customer, please refer to our +[Proxy Detection Legacy documentation](/minfraud/proxy-detection). +{{}} + minFraud is our transaction risk API, consisting of the minFraud Score, Insights and Factors services. + +## Guides + +{{< link-group/container >}} + {{< link-group/card + heading="Evaluate a Transaction" + href="/minfraud/evaluate-a-transaction" + >}} + Start evaluating your transactions by installing, configuring, and using a minFraud client API. + {{}} + + {{< link-group/card + heading="Report Transactions" + href="/minfraud/report-a-transaction" + >}} + Use the Report Transaction API to report chargebacks, false positives, suspected fraud, or spam/abuse. + {{}} + + + {{< link-group/card + heading="Integrate Device Tracking" + href="/minfraud/track-devices" + >}} + Capture more data and catch more fraud using our JavaScript device tracking library. + {{}} +{{}} + +## Resources + +{{< link-group/container >}} + {{< link-group/card + heading="API Documentation" + href="/minfraud/api-documentation" + >}} + Learn about each minFraud service's request and response objects. + {{}} + + {{< link-group/card + heading="Release Notes" + href="/minfraud/release-notes" + >}} + Review minFraud release notes to understand changes to the minFraud API. + {{}} + + {{< link-group/card + heading="Knowledge Base" + href="https://support.maxmind.com/hc/en-us/categories/1260801482329-minFraud-Web-Services" + >}} + Consult our knowledge base for articles about using minFraud. + {{}} +{{}} From f6782675cfd5d2b860deacb7ce6992be759e6abc Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 13:23:42 -0400 Subject: [PATCH 22/24] Add latest minfraud release note --- content/minfraud/release-notes/2024.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/minfraud/release-notes/2024.md b/content/minfraud/release-notes/2024.md index a828852d3..87f6b3d5c 100644 --- a/content/minfraud/release-notes/2024.md +++ b/content/minfraud/release-notes/2024.md @@ -9,8 +9,22 @@ outputs: ['html', 'rss'] Subscribe to the [minFraud release notes RSS feed](/minfraud/release-notes/rss.xml). {{}} -{{< release-note date="2024-08-27" title="Introducing Risk Score Reasons beta for minfraud Factors customers" >}} +{{< release-note date="2024-09-12" title="Increase in slightly elevated IP risk and proxy scores and remediation" >}} +On September 10, 2024 we pushed a model update to IP risk scoring that +increased a large volume of IP risk scores (also referred to as proxy score for +legacy services) at the lower end of the scale (between 0.01 and 1). + +While these IP risk scores remained low (less than 1), this shifted the score +distribution and may have impacted your systems depending on your score +thresholds. + +On September 12, 2024, we implemented an update that will decrease most of +these low IP risk scores again. To remediate this sort of issue in the future, +we will be increasing the sensitivity of our monitoring for scores on the lower +end of the distribution before releasing model updates. +{{}} +{{< release-note date="2024-08-27" title="Introducing Risk Score Reasons beta for minfraud Factors customers" >}} Today, we have released a new beta feature that will help minfraud Factors customers more deeply understand risk patterns and make more informed decisions. From 64269f3110d50ea65306f2673808896bd5f23275 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 13:38:05 -0400 Subject: [PATCH 23/24] Add anchor tag icon --- assets/scss/index.scss | 21 ++++++++++++++++++++ layouts/_default/_markup/render-heading.html | 2 +- layouts/shortcodes/release-note.html | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/assets/scss/index.scss b/assets/scss/index.scss index 85c79645b..3c230be36 100644 --- a/assets/scss/index.scss +++ b/assets/scss/index.scss @@ -42,3 +42,24 @@ :target { scroll-margin-top: 100px; } + + +a.heading-anchor { + &:hover { + text-decoration: none; + + &::before { + opacity: 1; + } + } + + &::before { + content: '#'; + color: var(--mm-color-logo-blue-light); + font-size: 17px; + left: -15px; + opacity: 0; + position: absolute; + transition: opacity 0.1s ease-in-out; + } +} diff --git a/layouts/_default/_markup/render-heading.html b/layouts/_default/_markup/render-heading.html index 128dc1579..d4d80ca56 100644 --- a/layouts/_default/_markup/render-heading.html +++ b/layouts/_default/_markup/render-heading.html @@ -1,3 +1,3 @@ - {{ .Text }} + {{ .Text }} diff --git a/layouts/shortcodes/release-note.html b/layouts/shortcodes/release-note.html index 89ca5fce6..7b5689c89 100644 --- a/layouts/shortcodes/release-note.html +++ b/layouts/shortcodes/release-note.html @@ -4,7 +4,7 @@

    - {{ $title }} + {{ $title }}

    {{ $date | time.Format ":date_long" }} From 37af7389f430967c61a386902c9e825257f62d65 Mon Sep 17 00:00:00 2001 From: kevcenteno Date: Wed, 18 Sep 2024 14:48:10 -0400 Subject: [PATCH 24/24] Fix mobile layout --- assets/scss/_base.scss | 11 ++++++++++- assets/scss/_header.scss | 2 +- assets/scss/_search.scss | 4 ++++ assets/scss/_sidebar.scss | 6 ++++-- assets/scss/_table.scss | 2 -- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/assets/scss/_base.scss b/assets/scss/_base.scss index 747948c32..b999781f7 100644 --- a/assets/scss/_base.scss +++ b/assets/scss/_base.scss @@ -1,15 +1,24 @@ @use 'mixins'; @use 'variables'; +*, +*::before, +*::after { + box-sizing: border-box; +} + body { background: var(--mm-color-background); - display: grid; font-family: var(--mm-font-stack-default); -webkit-font-smoothing: antialiased; line-height: 1.5; margin: 0; min-height: 100vh; padding: 0; + + @media only screen and (min-width: 992px) { + display: grid; + } } .wrapper { diff --git a/assets/scss/_header.scss b/assets/scss/_header.scss index 9b21ef719..d4537a6cc 100644 --- a/assets/scss/_header.scss +++ b/assets/scss/_header.scss @@ -36,7 +36,7 @@ $page-header-height: 80px; @include mixins.pattern-border; background: var(--mm-color-background); box-shadow: 0 1px 13px 0 rgba(0, 0, 0, 0.1), 0 1px 5px 0 rgba(0, 0, 0, 0.06); - height: calc(var(--page-header-height) - 10px); + height: var(--page-header-height); padding-top: 10px; position: sticky; top: 0; diff --git a/assets/scss/_search.scss b/assets/scss/_search.scss index 9f218c56f..8d9af941e 100644 --- a/assets/scss/_search.scss +++ b/assets/scss/_search.scss @@ -34,6 +34,10 @@ .search__button { @include mixins.menu-button; float: right; + + svg { + margin-top: 3px; + } } .input { diff --git a/assets/scss/_sidebar.scss b/assets/scss/_sidebar.scss index c0c911ca0..77e571baa 100644 --- a/assets/scss/_sidebar.scss +++ b/assets/scss/_sidebar.scss @@ -27,7 +27,7 @@ .sidebar-toggle__button span { backface-visibility: hidden; background-color: #000; - height: 1px; + height: 2px; transition: all .3s ease-out; width: 12px; @@ -38,6 +38,7 @@ } .sidebar-toggle__button.is-active span { + height: 1px; opacity: 0; &:first-child { @@ -68,11 +69,12 @@ overflow-y: auto; padding-bottom: 20px; padding-left: 20px; + scrollbar-width: thin; @media only screen and (min-width: 992px) { height: calc(100vh - var(--page-header-height) - 60px); position: sticky; - top: 130px; + top: 115px; } } diff --git a/assets/scss/_table.scss b/assets/scss/_table.scss index 2d230b32a..c078952d5 100644 --- a/assets/scss/_table.scss +++ b/assets/scss/_table.scss @@ -13,13 +13,11 @@ scrollbar-color: #0003 #0000; scrollbar-width: thin; width: 100%; - z-index: 2; table { border-collapse: collapse; font-size: 1rem; line-height: 1rem; - overflow-x: auto; width: 100%; }