diff --git a/gatsby-config.js b/gatsby-config.js
index ef5d67d33c5f..953502744d11 100644
--- a/gatsby-config.js
+++ b/gatsby-config.js
@@ -57,6 +57,12 @@ module.exports = {
apiHost: process.env.GATSBY_SQUEAK_API_HOST,
},
},
+ {
+ resolve: `gatsby-mapbox-locations`,
+ options: {
+ mapboxToken: process.env.MAPBOX_TOKEN,
+ },
+ },
{
resolve: 'gatsby-plugin-mailchimp',
options: {
diff --git a/plugins/gatsby-mapbox-locations/gatsby-node.js b/plugins/gatsby-mapbox-locations/gatsby-node.js
new file mode 100644
index 000000000000..4d9dcf9824fa
--- /dev/null
+++ b/plugins/gatsby-mapbox-locations/gatsby-node.js
@@ -0,0 +1,100 @@
+const MapboxClient = require('@mapbox/mapbox-sdk')
+const { chunk } = require('lodash')
+
+const locationForProfile = (profile) => {
+ return profile.location ?
+ { q: profile.location, types: ['place', 'region', 'country'] } :
+ { q: profile.country, types: ['country'] }
+}
+
+const sourceNodes = async (options, pluginOptions) => {
+ const { actions: { createNode }, createNodeId, createContentDigest, getNodes, reporter } = options
+ const { mapboxToken } = pluginOptions
+
+ if (!mapboxToken) {
+ reporter.panic('You must provide a Mapbox access token')
+ return
+ }
+
+ // Initialize Mapbox client
+ const mapboxClient = new MapboxClient({ accessToken: mapboxToken })
+
+ // Get all Squeak profiles directly from nodes
+ // Implement the filter below to guarantee we're not processing profiles that don't have a team
+
+ const profiles = getNodes()
+ .filter(node =>
+ node.internal.type === 'SqueakProfile' && // For all Squeak profiles
+ node.teams?.data?.length > 0 && // Implement the following to avoid old profiles: filter: { teams: { data: { elemMatch: { id: { ne: null } } } } }
+ (node.location || node.country) // Only process profiles with a location or country
+ )
+ .map(node => ({
+ id: node.id,
+ location: node.location,
+ country: node.country,
+ }))
+
+ const BATCH_SIZE = 50
+ const batches = chunk(profiles, BATCH_SIZE)
+
+ reporter.info(`Processing ${profiles.length} locations in ${batches.length} batches`)
+
+ const locations = []
+
+ for (const [index, batch] of batches.entries()) {
+ reporter.info(`Processing batch ${index + 1}/${batches.length}`)
+
+ try {
+ const response = await mapboxClient.createRequest({
+ method: 'POST',
+ path: '/search/geocode/v6/batch',
+ body: batch.map(locationForProfile)
+ }).send()
+
+ console.log(JSON.stringify(response.body.batch, null, 2))
+
+ // Match results with original profiles
+ response.body.batch.forEach((entry, i) => {
+ if (entry.features.length > 0) {
+ const [longitude, latitude] = entry.features[0]?.geometry?.coordinates
+ if (longitude && latitude) {
+ locations.push({
+ profileId: batch[i].id,
+ location: locationForProfile(batch[i]).q,
+ coordinates: {
+ latitude,
+ longitude
+ }
+ })
+ }
+ }
+ })
+ } catch (error) {
+ reporter.warn(`Failed to process batch ${index + 1}: ${error.message}`)
+ }
+ }
+
+ reporter.info(`Successfully processed ${locations.length} locations`)
+
+ // Create nodes directly here, not in a separate function
+ locations.forEach(location => {
+ const nodeContent = {
+ ...location,
+ }
+
+ const nodeMeta = {
+ id: createNodeId(`mapbox-location-${location.profileId}`),
+ parent: null,
+ children: [],
+ internal: {
+ type: `MapboxLocation`,
+ content: JSON.stringify(nodeContent),
+ contentDigest: createContentDigest(nodeContent),
+ },
+ }
+
+ createNode({ ...nodeContent, ...nodeMeta })
+ })
+}
+
+module.exports = { sourceNodes }
\ No newline at end of file
diff --git a/plugins/gatsby-mapbox-locations/package.json b/plugins/gatsby-mapbox-locations/package.json
new file mode 100644
index 000000000000..d51a5c336fcc
--- /dev/null
+++ b/plugins/gatsby-mapbox-locations/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "gatsby-mapbox-locations",
+ "version": "1.0.0",
+ "description": "Gatsby plugin to fetch location coordinates from Mapbox according to a Squeak source",
+ "main": "gatsby-node.js",
+ "dependencies": {
+ "@mapbox/mapbox-sdk": "^0.15.3"
+ }
+}
diff --git a/src/components/About/AboutTeam/Map.tsx b/src/components/About/AboutTeam/Map.tsx
index f53a498c833a..f9581eb4f2fc 100644
--- a/src/components/About/AboutTeam/Map.tsx
+++ b/src/components/About/AboutTeam/Map.tsx
@@ -1,38 +1,52 @@
import React from 'react'
-import { ComposableMap, Geographies, Geography, Marker, Text } from 'react-simple-maps'
+import { ComposableMap, Geographies, Geography, Marker } from 'react-simple-maps'
+import { useStaticQuery, graphql } from 'gatsby'
-const geoUrl = '/world-countries-sans-antarctica.json'
+// Avoid displaying two locations that are too close to each other
+const isOverlapping = (location: Location, locations: Location[], offset = 2) => {
+ return locations.some(otherLocation => {
+ return Math.abs(otherLocation.coordinates.latitude - location.coordinates.latitude) < offset &&
+ Math.abs(otherLocation.coordinates.longitude - location.coordinates.longitude) < offset
+ })
+}
+
+const GEO_URL = '/world-countries-sans-antarctica.json'
+const QUERY = graphql`
+ query {
+ allMapboxLocation {
+ nodes {
+ location
+ coordinates {
+ latitude
+ longitude
+ }
+ }
+ }
+ }
+`
+
+interface Location {
+ location: string
+ coordinates: {
+ latitude: number
+ longitude: number
+ }
+}
+
+export default function Map(): JSX.Element {
+ const data = useStaticQuery(QUERY)
+
+ const allLocations: Location[] = data.allMapboxLocation.nodes
+ const nonOverlappingLocations: Location[] = allLocations.reduce((otherLocations, location) => {
+ if (isOverlapping(location, otherLocations))
+ return otherLocations
-const locations = [
- { latitude: 41.38848523453815, longitude: 2.166622174480074 }, // barcelona
- { latitude: 50.49696315467801, longitude: 4.784774969058086 }, // belgium
- { latitude: 51.78883703365682, longitude: 0.09233783565354269 }, // london
- { latitude: 45.006964607558096, longitude: -69.08934685858212 }, // maine
- { latitude: 48.138139474816086, longitude: 11.56465867778196 }, // munich
- { latitude: 40.89197279618272, longitude: -73.3075046535768 }, // nyc
- { latitude: 52.953719434919975, longitude: 18.756829547133602 }, // poland
- { latitude: 39.576113891366866, longitude: -119.7908947720339 }, // reno
- { latitude: 37.774485054188894, longitude: -122.38519988449306 }, // san francisco
- { latitude: 37.55577207246805, longitude: -122.29307269491872 }, // san mateo
- { latitude: 27.950692375717704, longitude: -82.46326115746774 }, // tampa
- { latitude: 49.2827291, longitude: -123.1207375 }, // vancouver
- { latitude: 45.5016889, longitude: -73.567256 }, // montreal
- { latitude: 43.653226, longitude: -79.3831843 }, // toronto
- { latitude: 55.8642, longitude: -4.2518 }, // glasgow
- { latitude: 47.6062095, longitude: -122.3320708 }, // seattle
- { latitude: 44.977753, longitude: -93.2650108 }, // minneapolis
- { latitude: 4.570868, longitude: -74.297333 }, // colombia
- { latitude: 47.497912, longitude: 19.040235 }, // budapest
- { latitude: 53.3498053, longitude: -6.2603097 }, // dublin
- { latitude: 39.7392358, longitude: -104.990251 }, // denver
- { latitude: -34.6037, longitude: -58.3816 }, // buenos aires
- { latitude: -19.9167, longitude: -43.9345 }, // belo horizonte
-]
+ return [...otherLocations, location]
+ }, [] as Location[])
-export default function Map() {
return (
-
+
{({ geographies }) =>
geographies.map((geo) => (
- {locations.map(({ longitude, latitude }, index) => {
- return (
-
+ {nonOverlappingLocations.map(({ location, coordinates: { longitude, latitude } }) => (
+
+
+ {location}
-
- )
- })}
+
+
+ ))}
)
}
diff --git a/src/components/About/AboutTeam/index.tsx b/src/components/About/AboutTeam/index.tsx
index e5bca25b5be8..2dd7a7ed2eff 100644
--- a/src/components/About/AboutTeam/index.tsx
+++ b/src/components/About/AboutTeam/index.tsx
@@ -1,24 +1,9 @@
import React from 'react'
-import { StaticImage } from 'gatsby-plugin-image'
import { CallToAction } from 'components/CallToAction'
import { Avatar } from './Avatar'
import { graphql, useStaticQuery } from 'gatsby'
import Map from './Map'
-interface DotProps {
- classes: string
-}
-
-const Dot = ({ classes }: DotProps) => {
- return (
-
-
-
-
-
- )
-}
-
const avatarStyles = [
{ color: '#DCB1E3', className: 'right-[-30.5rem] top-[-2.5rem]', size: 'lg' },
{ color: '#FDEDC9', className: 'right-[-26rem] top-[-12rem]', size: 'md' },
@@ -32,13 +17,13 @@ const avatarStyles = [
]
export const AboutTeam = () => {
- const { teamMembers, allTeamMembers } = useStaticQuery(query)
+ const { avatarTeamMembers, teamMembers } = useStaticQuery(query)
const maxTheHedgehog = 1
return (
- We're a team of {allTeamMembers.count - maxTheHedgehog} from all over
+ We're a team of {teamMembers.count - maxTheHedgehog} from all over
the world.
@@ -53,7 +38,7 @@ export const AboutTeam = () => {
- {teamMembers.nodes.map(({ firstName, lastName, country, avatar }, index) => {
+ {avatarTeamMembers.nodes.map(({ firstName, lastName, country, avatar }, index) => {
const styles = avatarStyles[index]
const name = [firstName, lastName].filter(Boolean).join(' ')
return (
@@ -79,7 +64,7 @@ export const AboutTeam = () => {
const query = graphql`
{
- teamMembers: allSqueakProfile(
+ avatarTeamMembers: allSqueakProfile(
filter: {
lastName: { in: ["Andra", "Coxon", "Phang", "Obermüller", "Temperton", "Matloka", "Majerik"] }
teams: { data: { elemMatch: { attributes: { name: { ne: null } } } } }
@@ -95,7 +80,7 @@ const query = graphql`
}
}
}
- allTeamMembers: allSqueakProfile(filter: { teams: { data: { elemMatch: { id: { ne: null } } } } }) {
+ teamMembers: allSqueakProfile(filter: { teams: { data: { elemMatch: { id: { ne: null } } } } }) {
count: totalCount
}
}
diff --git a/yarn.lock b/yarn.lock
index c9982d5c9765..f1e38b97f078 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2309,6 +2309,42 @@
"@lottiefiles/relottie-stringify" "1.0.0"
unified "10.1.2"
+"@mapbox/fusspot@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@mapbox/fusspot/-/fusspot-0.4.0.tgz#5ac625b5ed31695fda465fb0413ee0379bdf553c"
+ integrity sha512-6sys1vUlhNCqMvJOqPEPSi0jc9tg7aJ//oG1A16H3PXoIt9whtNngD7UzBHUVTH15zunR/vRvMtGNVsogm1KzA==
+ dependencies:
+ is-plain-obj "^1.1.0"
+ xtend "^4.0.1"
+
+"@mapbox/mapbox-sdk@^0.15.3":
+ version "0.15.6"
+ resolved "https://registry.yarnpkg.com/@mapbox/mapbox-sdk/-/mapbox-sdk-0.15.6.tgz#61c0b0eaeb02c12592cfd431444a5f1533e2f1ce"
+ integrity sha512-eBkeSefaIVYO75nGpcTvfQkEjIVOQ4siAllOM/ka0W8FU8V47G+YnIss4cmjQRip14q9EOX+ofx85OzapqbqCg==
+ dependencies:
+ "@mapbox/fusspot" "^0.4.0"
+ "@mapbox/parse-mapbox-token" "^0.2.0"
+ "@mapbox/polyline" "^1.0.0"
+ eventemitter3 "^3.1.0"
+ form-data "^3.0.0"
+ got "^11.8.5"
+ is-plain-obj "^1.1.0"
+ xtend "^4.0.1"
+
+"@mapbox/parse-mapbox-token@^0.2.0":
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@mapbox/parse-mapbox-token/-/parse-mapbox-token-0.2.0.tgz#34049d948868376f689189a5ea0e3cd2d9284b91"
+ integrity sha512-BjeuG4sodYaoTygwXIuAWlZV6zUv4ZriYAQhXikzx+7DChycMUQ9g85E79Htat+AsBg+nStFALehlOhClYm5cQ==
+ dependencies:
+ base-64 "^0.1.0"
+
+"@mapbox/polyline@^1.0.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@mapbox/polyline/-/polyline-1.2.1.tgz#1eecce5e8c0d9e6dfc718b225e8e9f03591ea636"
+ integrity sha512-sn0V18O3OzW4RCcPoUIVDWvEGQaBNH9a0y5lgqrf5hUycyw1CzrhEoxV5irzrMNXKCkw1xRsZXcaVbsVZggHXA==
+ dependencies:
+ meow "^9.0.0"
+
"@mdx-js/mdx@^1.6.22":
version "1.6.22"
resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba"
@@ -4476,6 +4512,11 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+"@types/minimist@^1.2.0":
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
+ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
+
"@types/mkdirp@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
@@ -5677,6 +5718,11 @@ array.prototype.reduce@^1.0.4:
es-array-method-boxes-properly "^1.0.0"
is-string "^1.0.7"
+arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
+
arrify@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
@@ -6230,6 +6276,11 @@ bare-path@^2.0.0, bare-path@^2.1.0:
dependencies:
bare-os "^2.1.0"
+base-64@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
+ integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==
+
base-x@^3.0.8:
version "3.0.9"
resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320"
@@ -6793,6 +6844,15 @@ camelcase-keys@^2.0.0:
camelcase "^2.0.0"
map-obj "^1.0.0"
+camelcase-keys@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+ integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
+ dependencies:
+ camelcase "^5.3.1"
+ map-obj "^4.0.0"
+ quick-lru "^4.0.1"
+
camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@@ -8830,7 +8890,15 @@ debug@~4.3.2:
dependencies:
ms "^2.1.3"
-decamelize@^1.1.2, decamelize@^1.2.0:
+decamelize-keys@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8"
+ integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==
+ dependencies:
+ decamelize "^1.1.0"
+ map-obj "^1.0.0"
+
+decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
@@ -10086,6 +10154,11 @@ event-source-polyfill@1.0.25:
resolved "https://registry.yarnpkg.com/event-source-polyfill/-/event-source-polyfill-1.0.25.tgz#d8bb7f99cb6f8119c2baf086d9f6ee0514b6d9c8"
integrity sha512-hQxu6sN1Eq4JjoI7ITdQeGGUN193A2ra83qC0Ltm9I2UJVAten3OFVN6k5RX4YWeCS0BoC8xg/5czOCIHVosQg==
+eventemitter3@^3.1.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
+ integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
+
eventemitter3@^4.0.4, eventemitter3@^4.0.7:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
@@ -10926,6 +10999,11 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
function.prototype.name@^1.1.0, function.prototype.name@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
@@ -12230,6 +12308,11 @@ har-validator@~5.1.3:
ajv "^6.12.3"
har-schema "^2.0.0"
+hard-rejection@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+ integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
has-bigints@^1.0.1, has-bigints@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
@@ -12357,6 +12440,13 @@ hasha@^5.2.2:
is-stream "^2.0.0"
type-fest "^0.8.0"
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
hast-to-hyperscript@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d"
@@ -12581,6 +12671,13 @@ hosted-git-info@^3.0.8:
dependencies:
lru-cache "^6.0.0"
+hosted-git-info@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
+ integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
+ dependencies:
+ lru-cache "^6.0.0"
+
howler@^2.2.3:
version "2.2.4"
resolved "https://registry.yarnpkg.com/howler/-/howler-2.2.4.tgz#bd3df4a4f68a0118a51e4bd84a2bfc2e93e6e5a1"
@@ -13204,6 +13301,13 @@ is-core-module@^2.11.0, is-core-module@^2.9.0:
dependencies:
has "^1.0.3"
+is-core-module@^2.5.0:
+ version "2.16.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4"
+ integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
+ dependencies:
+ hasown "^2.0.2"
+
is-core-module@^2.8.1:
version "2.10.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
@@ -14590,7 +14694,7 @@ kind-of@^5.0.0:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-kind-of@^6.0.0, kind-of@^6.0.2:
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -15205,6 +15309,11 @@ map-obj@^1.0.0, map-obj@^1.0.1:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==
+map-obj@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
+ integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
+
map-or-similar@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08"
@@ -15578,6 +15687,24 @@ meow@^3.1.0:
redent "^1.0.0"
trim-newlines "^1.0.0"
+meow@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
+ integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
+ dependencies:
+ "@types/minimist" "^1.2.0"
+ camelcase-keys "^6.2.2"
+ decamelize "^1.2.0"
+ decamelize-keys "^1.1.0"
+ hard-rejection "^2.1.0"
+ minimist-options "4.1.0"
+ normalize-package-data "^3.0.0"
+ read-pkg-up "^7.0.1"
+ redent "^3.0.0"
+ trim-newlines "^3.0.0"
+ type-fest "^0.18.0"
+ yargs-parser "^20.2.3"
+
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -16083,6 +16210,15 @@ minimatch@^9.0.1:
dependencies:
brace-expansion "^2.0.1"
+minimist-options@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+ integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
+ dependencies:
+ arrify "^1.0.1"
+ is-plain-obj "^1.1.0"
+ kind-of "^6.0.3"
+
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
@@ -16553,6 +16689,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
+normalize-package-data@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e"
+ integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==
+ dependencies:
+ hosted-git-info "^4.0.1"
+ is-core-module "^2.5.0"
+ semver "^7.3.4"
+ validate-npm-package-license "^3.0.1"
+
normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@@ -18438,6 +18584,11 @@ queue-tick@^1.0.1:
resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142"
integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==
+quick-lru@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+ integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+
quick-lru@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
@@ -19133,6 +19284,14 @@ redent@^1.0.0:
indent-string "^2.1.0"
strip-indent "^1.0.1"
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+ dependencies:
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
+
redoc@^2.0.0-rc.62:
version "2.0.0"
resolved "https://registry.yarnpkg.com/redoc/-/redoc-2.0.0.tgz#8b3047ca75b84d31558c6c92da7f84affef35c3e"
@@ -21816,6 +21975,11 @@ trim-newlines@^1.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==
+trim-newlines@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
+ integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
+
trim-trailing-lines@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0"
@@ -21994,6 +22158,11 @@ type-detect@4.0.8, type-detect@^4.0.0:
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.18.0:
+ version "0.18.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
+ integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
+
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
@@ -23550,7 +23719,7 @@ yargs-parser@^18.1.2:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs-parser@^20.2.2, yargs-parser@^20.2.9:
+yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==