fix: formatting

This commit is contained in:
Nicholas Tindle
2024-12-12 14:44:30 -06:00
committed by abhi1992002
parent 023c5b9a17
commit d6297c43fd
16 changed files with 113 additions and 120 deletions

View File

@@ -60,6 +60,7 @@ class OAuthState(BaseModel):
scopes: list[str]
"""Unix timestamp (seconds) indicating when this OAuth state expires"""
class UserMetadata(BaseModel):
integration_credentials: list[Credentials] = Field(default_factory=list)
integration_oauth_states: list[OAuthState] = Field(default_factory=list)

View File

@@ -1,9 +1,8 @@
from typing import Literal
from backend.data.model import OAuth2Credentials
from pydantic import SecretStr
from backend.data.model import CredentialsField, CredentialsMetaInput
from backend.data.model import CredentialsField, CredentialsMetaInput, OAuth2Credentials
from backend.integrations.oauth.twitter import TwitterOAuthHandler
from backend.util.settings import Secrets

View File

@@ -12,26 +12,26 @@ from backend.blocks.twitter._mappers import (
get_backend_space_field,
get_backend_user_field,
)
from backend.blocks.twitter._types import (
from backend.blocks.twitter._types import ( # DMEventFieldFilter,
DMEventExpansionFilter,
DMEventTypeFilter,
DMMediaFieldFilter,
DMTweetFieldFilter,
ExpansionFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,
TweetPollFieldsFilter,
TweetFieldsFilter,
TweetUserFieldsFilter,
UserExpansionsFilter,
ListExpansionsFilter,
ListFieldsFilter,
SpaceExpansionsFilter,
SpaceFieldsFilter,
DMEventExpansionFilter,
# DMEventFieldFilter,
DMEventTypeFilter,
DMMediaFieldFilter,
DMTweetFieldFilter,
TweetReplySettingsFilter
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,
TweetPollFieldsFilter,
TweetReplySettingsFilter,
TweetUserFieldsFilter,
UserExpansionsFilter,
)
# Common Builder
class TweetExpansionsBuilder:
def __init__(self, param: Dict[str, Any]):
@@ -40,8 +40,7 @@ class TweetExpansionsBuilder:
def add_expansions(self, expansions: ExpansionFilter):
if expansions:
filtered_expansions = [
name for name, value in expansions.dict().items()
if value is True
name for name, value in expansions.dict().items() if value is True
]
if filtered_expansions:
@@ -55,8 +54,7 @@ class TweetExpansionsBuilder:
def add_media_fields(self, media_fields: TweetMediaFieldsFilter):
if media_fields:
filtered_fields = [
name for name, value in media_fields.dict().items()
if value is True
name for name, value in media_fields.dict().items() if value is True
]
if filtered_fields:
self.params["media.fields"] = ",".join(
@@ -67,8 +65,7 @@ class TweetExpansionsBuilder:
def add_place_fields(self, place_fields: TweetPlaceFieldsFilter):
if place_fields:
filtered_fields = [
name for name, value in place_fields.dict().items()
if value is True
name for name, value in place_fields.dict().items() if value is True
]
if filtered_fields:
self.params["place.fields"] = ",".join(
@@ -79,8 +76,7 @@ class TweetExpansionsBuilder:
def add_poll_fields(self, poll_fields: TweetPollFieldsFilter):
if poll_fields:
filtered_fields = [
name for name, value in poll_fields.dict().items()
if value is True
name for name, value in poll_fields.dict().items() if value is True
]
if filtered_fields:
self.params["poll.fields"] = ",".join(
@@ -91,8 +87,7 @@ class TweetExpansionsBuilder:
def add_tweet_fields(self, tweet_fields: TweetFieldsFilter):
if tweet_fields:
filtered_fields = [
name for name, value in tweet_fields.dict().items()
if value is True
name for name, value in tweet_fields.dict().items() if value is True
]
if filtered_fields:
self.params["tweet.fields"] = ",".join(
@@ -103,8 +98,7 @@ class TweetExpansionsBuilder:
def add_user_fields(self, user_fields: TweetUserFieldsFilter):
if user_fields:
filtered_fields = [
name for name, value in user_fields.dict().items()
if value is True
name for name, value in user_fields.dict().items() if value is True
]
if filtered_fields:
self.params["user.fields"] = ",".join(
@@ -123,8 +117,7 @@ class UserExpansionsBuilder:
def add_expansions(self, expansions: UserExpansionsFilter):
if expansions:
filtered_expansions = [
name for name, value in expansions.dict().items()
if value is True
name for name, value in expansions.dict().items() if value is True
]
if filtered_expansions:
self.params["expansions"] = ",".join(filtered_expansions)
@@ -133,8 +126,7 @@ class UserExpansionsBuilder:
def add_tweet_fields(self, tweet_fields: TweetFieldsFilter):
if tweet_fields:
filtered_fields = [
name for name, value in tweet_fields.dict().items()
if value is True
name for name, value in tweet_fields.dict().items() if value is True
]
if filtered_fields:
self.params["tweet.fields"] = ",".join(
@@ -145,8 +137,7 @@ class UserExpansionsBuilder:
def add_user_fields(self, user_fields: TweetUserFieldsFilter):
if user_fields:
filtered_fields = [
name for name, value in user_fields.dict().items()
if value is True
name for name, value in user_fields.dict().items() if value is True
]
if filtered_fields:
self.params["user.fields"] = ",".join(
@@ -165,8 +156,7 @@ class ListExpansionsBuilder:
def add_expansions(self, expansions: ListExpansionsFilter):
if expansions:
filtered_expansions = [
name for name, value in expansions.dict().items()
if value is True
name for name, value in expansions.dict().items() if value is True
]
if filtered_expansions:
self.params["expansions"] = ",".join(
@@ -177,8 +167,7 @@ class ListExpansionsBuilder:
def add_list_fields(self, list_fields: ListFieldsFilter):
if list_fields:
filtered_fields = [
name for name, value in list_fields.dict().items()
if value is True
name for name, value in list_fields.dict().items() if value is True
]
if filtered_fields:
self.params["list.fields"] = ",".join(
@@ -189,8 +178,7 @@ class ListExpansionsBuilder:
def add_user_fields(self, user_fields: TweetUserFieldsFilter):
if user_fields:
filtered_fields = [
name for name, value in user_fields.dict().items()
if value is True
name for name, value in user_fields.dict().items() if value is True
]
if filtered_fields:
self.params["user.fields"] = ",".join(
@@ -209,8 +197,7 @@ class SpaceExpansionsBuilder:
def add_expansions(self, expansions: SpaceExpansionsFilter):
if expansions:
filtered_expansions = [
name for name, value in expansions.dict().items()
if value is True
name for name, value in expansions.dict().items() if value is True
]
if filtered_expansions:
self.params["expansions"] = ",".join(
@@ -221,8 +208,7 @@ class SpaceExpansionsBuilder:
def add_space_fields(self, space_fields: SpaceFieldsFilter):
if space_fields:
filtered_fields = [
name for name, value in space_fields.dict().items()
if value is True
name for name, value in space_fields.dict().items() if value is True
]
if filtered_fields:
self.params["space.fields"] = ",".join(
@@ -233,8 +219,7 @@ class SpaceExpansionsBuilder:
def add_user_fields(self, user_fields: TweetUserFieldsFilter):
if user_fields:
filtered_fields = [
name for name, value in user_fields.dict().items()
if value is True
name for name, value in user_fields.dict().items() if value is True
]
if filtered_fields:
self.params["user.fields"] = ",".join(
@@ -286,8 +271,7 @@ class DMExpansionsBuilder:
def add_expansions(self, expansions: DMEventExpansionFilter):
if expansions:
filtered_expansions = [
name for name, value in expansions.dict().items()
if value is True
name for name, value in expansions.dict().items() if value is True
]
if filtered_expansions:
self.params["expansions"] = ",".join(filtered_expansions)
@@ -296,8 +280,7 @@ class DMExpansionsBuilder:
def add_event_types(self, event_types: DMEventTypeFilter):
if event_types:
filtered_types = [
name for name, value in event_types.dict().items()
if value is True
name for name, value in event_types.dict().items() if value is True
]
if filtered_types:
self.params["event_types"] = ",".join(filtered_types)
@@ -306,8 +289,7 @@ class DMExpansionsBuilder:
def add_media_fields(self, media_fields: DMMediaFieldFilter):
if media_fields:
filtered_fields = [
name for name, value in media_fields.dict().items()
if value is True
name for name, value in media_fields.dict().items() if value is True
]
if filtered_fields:
self.params["media.fields"] = ",".join(filtered_fields)
@@ -316,8 +298,7 @@ class DMExpansionsBuilder:
def add_tweet_fields(self, tweet_fields: DMTweetFieldFilter):
if tweet_fields:
filtered_fields = [
name for name, value in tweet_fields.dict().items()
if value is True
name for name, value in tweet_fields.dict().items() if value is True
]
if filtered_fields:
self.params["tweet.fields"] = ",".join(filtered_fields)
@@ -326,8 +307,7 @@ class DMExpansionsBuilder:
def add_user_fields(self, user_fields: TweetUserFieldsFilter):
if user_fields:
filtered_fields = [
name for name, value in user_fields.dict().items()
if value is True
name for name, value in user_fields.dict().items() if value is True
]
if filtered_fields:
self.params["user.fields"] = ",".join(filtered_fields)
@@ -405,7 +385,10 @@ class TweetPostBuilder:
return self
def add_reply_settings(
self, exclude_user_ids: list, reply_to_id: str, settings: TweetReplySettingsFilter
self,
exclude_user_ids: list,
reply_to_id: str,
settings: TweetReplySettingsFilter,
):
if exclude_user_ids:
self.params["exclude_reply_user_ids"] = exclude_user_ids

View File

@@ -1,15 +1,19 @@
from enum import Enum
from backend.data.block import BlockSchema
from backend.data.model import SchemaField
from pydantic import BaseModel
from backend.data.block import BlockSchema
from backend.data.model import SchemaField
# -------------- Tweets -----------------
class TweetReplySettingsFilter(BaseModel):
Mentioned_Users_Only: bool = False
Following_Users_Only: bool = False
All_Users: bool = False
class TweetUserFieldsFilter(BaseModel):
Account_Creation_Date: bool = False
User_Bio: bool = False
@@ -28,6 +32,7 @@ class TweetUserFieldsFilter(BaseModel):
Verification_Type: bool = False
Content_Withholding_Info: bool = False
class TweetFieldsFilter(BaseModel):
Tweet_Attachments: bool = False
Author_ID: bool = False
@@ -48,6 +53,7 @@ class TweetFieldsFilter(BaseModel):
Tweet_Text: bool = False
Withheld_Content: bool = False
class PersonalTweetFieldsFilter(BaseModel):
attachments: bool = False
author_id: bool = False
@@ -71,6 +77,7 @@ class PersonalTweetFieldsFilter(BaseModel):
text: bool = False
withheld: bool = False
class TweetPollFieldsFilter(BaseModel):
Duration_Minutes: bool = False
End_DateTime: bool = False
@@ -78,6 +85,7 @@ class TweetPollFieldsFilter(BaseModel):
Poll_Options: bool = False
Voting_Status: bool = False
class TweetPlaceFieldsFilter(BaseModel):
Contained_Within_Places: bool = False
Country: bool = False
@@ -88,6 +96,7 @@ class TweetPlaceFieldsFilter(BaseModel):
Place_Name: bool = False
Place_Type: bool = False
class TweetMediaFieldsFilter(BaseModel):
Duration_in_Milliseconds: bool = False
Height: bool = False
@@ -103,28 +112,34 @@ class TweetMediaFieldsFilter(BaseModel):
Alternative_Text: bool = False
Media_Variants: bool = False
class ExpansionFilter(BaseModel):
Poll_IDs: bool = False
Media_Keys: bool = False
Author_User_ID: bool = False
Edit_History_Tweet_IDs: bool = False
Mentioned_Usernames: bool = False
Place_ID: bool = False
Reply_To_User_ID: bool = False
Referenced_Tweet_ID: bool = False
Referenced_Tweet_Author_ID: bool = False
Poll_IDs: bool = False
Media_Keys: bool = False
Author_User_ID: bool = False
Edit_History_Tweet_IDs: bool = False
Mentioned_Usernames: bool = False
Place_ID: bool = False
Reply_To_User_ID: bool = False
Referenced_Tweet_ID: bool = False
Referenced_Tweet_Author_ID: bool = False
class TweetExcludesFilter(BaseModel):
retweets: bool = False
replies: bool = False
# -------------- Users -----------------
class UserExpansionsFilter(BaseModel):
pinned_tweet_id: bool = False
# -------------- DM's' -----------------
class DMEventFieldFilter(BaseModel):
id: bool = False
text: bool = False
@@ -136,17 +151,20 @@ class DMEventFieldFilter(BaseModel):
referenced_tweets: bool = False
attachments: bool = False
class DMEventTypeFilter(BaseModel):
MessageCreate: bool = False
ParticipantsJoin: bool = False
ParticipantsLeave: bool = False
class DMEventExpansionFilter(BaseModel):
attachments_media_keys: bool = False
referenced_tweets_id: bool = False
sender_id: bool = False
participant_ids: bool = False
class DMMediaFieldFilter(BaseModel):
duration_ms: bool = False
height: bool = False
@@ -159,6 +177,7 @@ class DMMediaFieldFilter(BaseModel):
alt_text: bool = False
variants: bool = False
class DMTweetFieldFilter(BaseModel):
attachments: bool = False
author_id: bool = False
@@ -179,8 +198,10 @@ class DMTweetFieldFilter(BaseModel):
text: bool = False
withheld: bool = False
# -------------- Spaces -----------------
class SpaceExpansionsFilter(BaseModel):
Invited_Users: bool = False
Speakers: bool = False
@@ -188,6 +209,7 @@ class SpaceExpansionsFilter(BaseModel):
Hosts: bool = False
Topics: bool = False
class SpaceFieldsFilter(BaseModel):
Space_ID: bool = False
Space_State: bool = False
@@ -206,16 +228,20 @@ class SpaceFieldsFilter(BaseModel):
Topic_IDs: bool = False
Last_Updated_Time: bool = False
class SpaceStatesFilter(str , Enum):
class SpaceStatesFilter(str, Enum):
live = "live"
scheduled = "scheduled"
all = "all"
# -------------- List Expansions -----------------
class ListExpansionsFilter(BaseModel):
List_Owner_ID: bool = False
class ListFieldsFilter(BaseModel):
List_ID: bool = False
List_Name: bool = False
@@ -226,6 +252,7 @@ class ListFieldsFilter(BaseModel):
Is_Private: bool = False
Owner_ID: bool = False
# --------- [Input Types] -------------
class TweetExpansionInputs(BlockSchema):
@@ -265,6 +292,7 @@ class TweetExpansionInputs(BlockSchema):
advanced=True,
)
class DMEventExpansionInputs(BlockSchema):
expansions: DMEventExpansionFilter = SchemaField(
description="Select expansions to include related data objects in the 'includes' section.",
@@ -296,6 +324,7 @@ class DMEventExpansionInputs(BlockSchema):
advanced=True,
)
class UserExpansionInputs(BlockSchema):
expansions: UserExpansionsFilter = SchemaField(
description="Choose what extra information you want to get with user data. Currently only 'pinned_tweet_id' is available to see a user's pinned tweet.",
@@ -315,6 +344,7 @@ class UserExpansionInputs(BlockSchema):
advanced=True,
)
class SpaceExpansionInputs(BlockSchema):
expansions: SpaceExpansionsFilter = SchemaField(
description="Choose additional information you want to get with your Twitter Spaces:\n- Select 'Invited_Users' to see who was invited\n- Select 'Speakers' to see who can speak\n- Select 'Creator' to get details about who made the Space\n- Select 'Hosts' to see who's hosting\n- Select 'Topics' to see Space topics",
@@ -335,6 +365,7 @@ class SpaceExpansionInputs(BlockSchema):
advanced=True,
)
class ListExpansionInputs(BlockSchema):
expansions: ListExpansionsFilter = SchemaField(
description="Choose what extra information you want to get with your Twitter Lists:\n- Select 'List_Owner_ID' to get details about who owns the list\n\nThis will let you see more details about the list owner when you also select user fields below.",
@@ -357,6 +388,7 @@ class ListExpansionInputs(BlockSchema):
advanced=True,
)
class TweetTimeWindowInputs(BlockSchema):
start_time: str = SchemaField(
description="Start time in YYYY-MM-DDTHH:mm:ssZ format",

View File

@@ -16,8 +16,8 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
TweetExpansionInputs,
ExpansionFilter,
TweetExpansionInputs,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,

View File

@@ -20,11 +20,11 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
ExpansionFilter,
SpaceExpansionInputs,
SpaceExpansionsFilter,
SpaceFieldsFilter,
TweetExpansionInputs,
ExpansionFilter,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,

View File

@@ -16,8 +16,8 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
TweetExpansionInputs,
ExpansionFilter,
TweetExpansionInputs,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,

View File

@@ -19,8 +19,8 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
TweetExpansionInputs,
ExpansionFilter,
TweetExpansionInputs,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,

View File

@@ -27,9 +27,9 @@ from backend.blocks.twitter._types import (
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,
TweetPollFieldsFilter,
TweetReplySettingsFilter,
TweetTimeWindowInputs,
TweetUserFieldsFilter,
TweetReplySettingsFilter
)
from backend.blocks.twitter.tweepy_exceptions import handle_tweepy_exception
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema

View File

@@ -16,9 +16,9 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
ExpansionFilter,
TweetExcludesFilter,
TweetExpansionInputs,
ExpansionFilter,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,
@@ -62,7 +62,7 @@ class TwitterGetQuoteTweetsBlock(Block):
description="Token for pagination",
required=False,
advanced=True,
default = ""
default="",
)
class Output(BlockSchema):

View File

@@ -19,8 +19,8 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
TweetExpansionInputs,
ExpansionFilter,
TweetExpansionInputs,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,

View File

@@ -16,8 +16,8 @@ from backend.blocks.twitter._serializer import (
ResponseDataSerializer,
)
from backend.blocks.twitter._types import (
TweetExpansionInputs,
ExpansionFilter,
TweetExpansionInputs,
TweetFieldsFilter,
TweetMediaFieldsFilter,
TweetPlaceFieldsFilter,

View File

@@ -1,6 +1,6 @@
import secrets
import hashlib
import base64
import hashlib
import secrets
from datetime import datetime, timedelta, timezone
from typing import TYPE_CHECKING, Optional
@@ -212,7 +212,9 @@ class IntegrationCredentialsStore:
]
self._set_user_integration_creds(user_id, filtered_credentials)
def store_state_token(self, user_id: str, provider: str, scopes: list[str], use_pkce: bool = False) -> tuple[str, str]:
def store_state_token(
self, user_id: str, provider: str, scopes: list[str], use_pkce: bool = False
) -> tuple[str, str]:
token = secrets.token_urlsafe(32)
expires_at = datetime.now(timezone.utc) + timedelta(minutes=10)
@@ -221,7 +223,7 @@ class IntegrationCredentialsStore:
state = OAuthState(
token=token,
provider=provider,
code_verifier= code_verifier,
code_verifier=code_verifier,
expires_at=int(expires_at.timestamp()),
scopes=scopes,
)
@@ -245,11 +247,13 @@ class IntegrationCredentialsStore:
Currently only SHA256 is supported.(In future if we want to support more methods we can add them here)
"""
code_verifier = secrets.token_urlsafe(128)
sha256_hash = hashlib.sha256(code_verifier.encode('utf-8')).digest()
code_challenge = base64.urlsafe_b64encode(sha256_hash).decode('utf-8')
return code_challenge.replace('=', ''), code_verifier
sha256_hash = hashlib.sha256(code_verifier.encode("utf-8")).digest()
code_challenge = base64.urlsafe_b64encode(sha256_hash).decode("utf-8")
return code_challenge.replace("=", ""), code_verifier
def verify_state_token(self, user_id: str, token: str, provider: str) -> Optional[OAuthState]:
def verify_state_token(
self, user_id: str, token: str, provider: str
) -> Optional[OAuthState]:
with self.locked_user_integrations(user_id):
user_integrations = self._get_user_integrations(user_id)
oauth_states = user_integrations.oauth_states

View File

@@ -3,8 +3,8 @@ import urllib.parse
from typing import ClassVar, Optional
import requests
from backend.data.model import OAuth2Credentials
from backend.data.model import OAuth2Credentials
from backend.integrations.oauth.base import BaseOAuthHandler

View File

@@ -104,7 +104,9 @@ def callback(
scopes = handler.handle_default_scopes(scopes)
credentials = handler.exchange_code_for_tokens(code, scopes, valid_state.code_verifier)
credentials = handler.exchange_code_for_tokens(
code, scopes, valid_state.code_verifier
)
logger.debug(f"Received credentials with final scopes: {credentials.scopes}")

View File

@@ -8864,16 +8864,11 @@ minipass@^4.2.4:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a"
integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
@@ -9497,7 +9492,7 @@ picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
picomatch@^2.0.4:
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -9632,7 +9627,7 @@ postcss-nested@^6.2.0:
dependencies:
postcss-selector-parser "^6.1.1"
postcss-selector-parser@^6.1.1:
postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2:
version "6.1.2"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de"
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
@@ -9640,14 +9635,6 @@ postcss-selector-parser@^6.1.1:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-selector-parser@^6.1.2:
version "6.1.2"
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
dependencies:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-selector-parser@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c"
@@ -10461,7 +10448,7 @@ scheduler@^0.23.2:
dependencies:
loose-envify "^1.1.0"
schema-utils@^3.1.1:
schema-utils@^3.1.1, schema-utils@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
@@ -10694,7 +10681,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@^0.6.1:
source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -10704,21 +10691,6 @@ source-map@^0.7.3:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
source-map@~0.6.0:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
space-separated-tokens@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f"