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==