add support for oneOf and optional oneOf

This commit is contained in:
abhi1992002
2025-01-02 16:24:00 +05:30
parent 1be3a29dc0
commit 4fe135e472
5 changed files with 198 additions and 170 deletions

View File

@@ -1,5 +1,6 @@
from datetime import datetime
from typing import cast
from typing import List, Literal, Optional, Union, cast
from pydantic import BaseModel
import tweepy
from tweepy.client import Response
@@ -36,6 +37,27 @@ from backend.blocks.twitter.tweepy_exceptions import handle_tweepy_exception
from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema
from backend.data.model import SchemaField
class Media(BaseModel):
discriminator: Literal['media']
media_ids: Optional[List[str]] = None
media_tagged_user_ids: Optional[List[str]] = None
class DeepLink(BaseModel):
discriminator: Literal['deep_link']
direct_message_deep_link: Optional[str] = None
class Poll(BaseModel):
discriminator: Literal['poll']
poll_options: Optional[List[str]] = None
poll_duration_minutes: Optional[int] = None
class Place(BaseModel):
discriminator: Literal['place']
place_id: Optional[str] = None
class Quote(BaseModel):
discriminator: Literal['quote']
quote_tweet_id: Optional[str] = None
class TwitterPostTweetBlock(Block):
"""
@@ -48,71 +70,33 @@ class TwitterPostTweetBlock(Block):
)
tweet_text: str = SchemaField(
description="Text of the tweet to post [It's Optional if you want to add media, quote, or deep link]",
description="Text of the tweet to post",
placeholder="Enter your tweet",
advanced=False,
default="",
)
media_ids: list = SchemaField(
description="List of media IDs to attach to the tweet, [ex - 1455952740635586573]",
placeholder="Enter media IDs",
default=[],
)
media_tagged_user_ids: list = SchemaField(
description="List of user IDs to tag in media, [ex - 1455952740635586573]",
placeholder="Enter media tagged user IDs",
default=[],
)
direct_message_deep_link: str = SchemaField(
description="Link directly to a Direct Message conversation with an account [ex - https://twitter.com/messages/compose?recipient_id={your_id}]",
placeholder="Enter direct message deep link",
default="",
)
poll_options: list = SchemaField(
description="List of poll options",
placeholder="Enter poll options",
default=[],
)
poll_duration_minutes: int = SchemaField(
description="Duration of the poll in minutes",
placeholder="Enter poll duration in minutes",
default=0,
)
for_super_followers_only: bool = SchemaField(
description="Tweet exclusively for Super Followers",
placeholder="Enter for super followers only",
advanced=True,
default=False,
)
place_id: str = SchemaField(
description="Adds optional location information to a tweet if geo settings are enabled in your profile.",
placeholder="Enter place ID",
default="",
)
quote_tweet_id: str = SchemaField(
description="Link to the Tweet being quoted, [ex- 1455953449422516226]",
attachment: Union[Media, DeepLink, Poll, Place, Quote] | None = SchemaField(
discriminator='discriminator',
description="Additional tweet data (media, deep link, poll, place or quote)",
advanced=True,
placeholder="Enter quote tweet ID",
default="",
)
exclude_reply_user_ids: list = SchemaField(
description="User IDs to exclude from reply Tweet thread. [ex - 6253282] ",
exclude_reply_user_ids: Optional[List[str]] = SchemaField(
description="User IDs to exclude from reply Tweet thread. [ex - 6253282]",
placeholder="Enter user IDs to exclude",
advanced=True,
default=[],
default=None,
)
in_reply_to_tweet_id: str = SchemaField(
in_reply_to_tweet_id: Optional[str] = SchemaField(
description="Tweet ID being replied to. Please note that in_reply_to_tweet_id needs to be in the request if exclude_reply_user_ids is present",
default="",
default=None,
placeholder="Enter in reply to tweet ID",
advanced=True,
)
@@ -141,12 +125,11 @@ class TwitterPostTweetBlock(Block):
test_input={
"tweet_text": "This is a test tweet.",
"credentials": TEST_CREDENTIALS_INPUT,
"direct_message_deep_link": "",
"attachment": {
"discriminator": "deep_link",
"direct_message_deep_link": "https://twitter.com/messages/compose"
},
"for_super_followers_only": False,
"place_id": "",
"media_ids": [],
"media_tagged_user_ids": [],
"quote_tweet_id": "",
"exclude_reply_user_ids": [],
"in_reply_to_tweet_id": "",
},
@@ -163,20 +146,14 @@ class TwitterPostTweetBlock(Block):
},
)
@staticmethod
def post_tweet(
self,
credentials: TwitterCredentials,
input_txt: str,
media_ids: list,
media_tagged_user_ids: list,
direct_message_deep_link: str,
attachment: Union[Media, DeepLink, Poll, Place, Quote],
for_super_followers_only: bool,
place_id: str,
poll_options: list,
poll_duration_minutes: int,
quote_tweet_id: str,
exclude_reply_user_ids: list,
in_reply_to_tweet_id: str,
exclude_reply_user_ids: Optional[List[str]],
in_reply_to_tweet_id: Optional[str],
reply_settings: TweetReplySettingsFilter,
):
try:
@@ -187,20 +164,27 @@ class TwitterPostTweetBlock(Block):
params = (
TweetPostBuilder()
.add_text(input_txt)
.add_media(media_ids, media_tagged_user_ids)
.add_deep_link(direct_message_deep_link)
.add_super_followers(for_super_followers_only)
.add_poll_options(poll_options)
.add_poll_duration(poll_duration_minutes)
.add_place(place_id)
.add_quote(quote_tweet_id)
.add_reply_settings(
exclude_reply_user_ids, in_reply_to_tweet_id, reply_settings
exclude_reply_user_ids or [],
in_reply_to_tweet_id or "",
reply_settings
)
.build()
)
tweet = cast(Response, client.create_tweet(**params))
if isinstance(attachment, Media):
params.add_media(attachment.media_ids or [], attachment.media_tagged_user_ids or [])
elif isinstance(attachment, DeepLink):
params.add_deep_link(attachment.direct_message_deep_link or "")
elif isinstance(attachment, Poll):
params.add_poll_options(attachment.poll_options or [])
params.add_poll_duration(attachment.poll_duration_minutes or 0)
elif isinstance(attachment, Place):
params.add_place(attachment.place_id or "")
elif isinstance(attachment, Quote):
params.add_quote(attachment.quote_tweet_id or "")
tweet = cast(Response, client.create_tweet(**params.build()))
if not tweet.data:
raise Exception("Failed to create tweet")
@@ -225,14 +209,8 @@ class TwitterPostTweetBlock(Block):
tweet_id, tweet_url = self.post_tweet(
credentials,
input_data.tweet_text,
input_data.media_ids,
input_data.media_tagged_user_ids,
input_data.direct_message_deep_link,
input_data.attachment,
input_data.for_super_followers_only,
input_data.place_id,
input_data.poll_options,
input_data.poll_duration_minutes,
input_data.quote_tweet_id,
input_data.exclude_reply_user_ids,
input_data.in_reply_to_tweet_id,
input_data.reply_settings,

View File

@@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
[[package]]
name = "aio-pika"
@@ -4189,4 +4189,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.10,<3.13"
content-hash = "9325d134cf2c4390c520b9c5e8bae290a0fa05e0c782aa6b1f079d31d9a5c8f5"
content-hash = "edbddc68b7bfc01b2eb5a8d17933ea22277acc1d7ed8169781dc0f2f70313d7d"

View File

@@ -252,7 +252,13 @@ export function CustomNode({
!isHidden &&
(isRequired || isAdvancedOpen || isConnected || !isAdvanced) && (
<div key={propKey} data-id={`input-handle-${propKey}`}>
{isConnectable ? (
{isConnectable &&
!(
"oneOf" in propSchema &&
propSchema.oneOf &&
"discriminator" in propSchema &&
propSchema.discriminator
) ? (
<NodeHandle
keyName={propKey}
isConnected={isConnected}

View File

@@ -227,6 +227,8 @@ export const NodeGenericInputField: FC<{
);
}
console.log("propSchema", propSchema);
if ("properties" in propSchema) {
// Render a multi-select for all-boolean sub-schemas with more than 3 properties
if (
@@ -292,6 +294,29 @@ export const NodeGenericInputField: FC<{
}
if ("anyOf" in propSchema) {
// Optional oneOf
if (
"oneOf" in propSchema.anyOf[0] &&
propSchema.anyOf[0].oneOf &&
"discriminator" in propSchema.anyOf[0] &&
propSchema.anyOf[0].discriminator
) {
return (
<NodeOneOfDiscriminatorField
nodeId={nodeId}
propKey={propKey}
propSchema={propSchema.anyOf[0]}
currentValue={currentValue}
errors={errors}
connections={connections}
handleInputChange={handleInputChange}
handleInputClick={handleInputClick}
className={className}
displayName={displayName}
/>
);
}
// optional items
const types = propSchema.anyOf.map((s) =>
"type" in s ? s.type : undefined,
@@ -579,7 +604,7 @@ const NodeOneOfDiscriminatorField: FC<{
propSchema: any;
currentValue?: any;
errors: { [key: string]: string | undefined };
connections: any;
connections: ConnectionData;
handleInputChange: (key: string, value: any) => void;
handleInputClick: (key: string) => void;
className?: string;
@@ -594,7 +619,6 @@ const NodeOneOfDiscriminatorField: FC<{
handleInputChange,
handleInputClick,
className,
displayName,
}) => {
const discriminator = propSchema.discriminator;
@@ -610,7 +634,7 @@ const NodeOneOfDiscriminatorField: FC<{
return {
value: variantDiscValue,
schema: variant,
schema: variant as BlockIOSubSchema,
};
})
.filter((v: any) => v.value != null);
@@ -641,8 +665,23 @@ const NodeOneOfDiscriminatorField: FC<{
(opt: any) => opt.value === chosenType,
)?.schema;
function getEntryKey(key: string): string {
return `${propKey}_#_${key}`;
}
function isConnected(key: string): boolean {
return connections.some(
(c) => c.targetHandle === getEntryKey(key) && c.target === nodeId,
);
}
return (
<div className={cn("flex flex-col space-y-2", className)}>
<div
className={cn(
"flex min-w-[400px] max-w-[95%] flex-col space-y-4",
className,
)}
>
<Select value={chosenType || ""} onValueChange={handleVariantChange}>
<SelectTrigger className="w-full">
<SelectValue placeholder="Select a type..." />
@@ -667,28 +706,32 @@ const NodeOneOfDiscriminatorField: FC<{
return (
<div
key={childKey}
className="flex w-full flex-row justify-between space-y-2"
className="mb-4 flex w-full flex-col justify-between space-y-2"
>
<span className="mr-2 mt-3 dark:text-gray-300">
{(childSchema as BlockIOSubSchema).title ||
beautifyString(someKey)}
</span>
<NodeGenericInputField
nodeId={nodeId}
key={propKey}
propKey={childKey}
propSchema={childSchema as BlockIOSubSchema}
currentValue={
currentValue ? currentValue[someKey] : undefined
}
errors={errors}
connections={connections}
handleInputChange={handleInputChange}
handleInputClick={handleInputClick}
displayName={
chosenVariantSchema.title || beautifyString(someKey)
}
<NodeHandle
keyName={getEntryKey(childKey)}
schema={childSchema as BlockIOSubSchema}
isConnected={isConnected(getEntryKey(childKey))}
isRequired={false}
side="left"
/>
{!isConnected(childKey) && (
<NodeGenericInputField
nodeId={nodeId}
key={propKey}
propKey={childKey}
propSchema={childSchema as BlockIOSubSchema}
currentValue={
currentValue ? currentValue[someKey] : undefined
}
errors={errors}
connections={connections}
handleInputChange={handleInputChange}
handleInputClick={handleInputClick}
displayName={beautifyString(someKey)}
/>
)}
</div>
);
},

View File

@@ -3798,9 +3798,9 @@
integrity sha512-JkXTOdKs5MF086b/pt8C3+yVp3iDUwG635L7oCH6HvJvvr6lSUU5oe/gLXnPEfYRROHjJIPgCV6cuAg8gGkntQ==
"@types/node@*", "@types/node@^22.0.0", "@types/node@^22.9.0":
version "22.10.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9"
integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==
version "22.10.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.3.tgz#cdc2a89bf6e5d5e593fad08e83f74d7348d5dd10"
integrity sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==
dependencies:
undici-types "~6.20.0"
@@ -3950,61 +3950,61 @@
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.2.tgz#c78e363ab5fe3b21dd1c90d8be9581534417f78e"
integrity sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.0.tgz#2b1e1b791e21d5fc27ddc93884db066444f597b5"
integrity sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
"@typescript-eslint/scope-manager" "8.18.2"
"@typescript-eslint/type-utils" "8.18.2"
"@typescript-eslint/utils" "8.18.2"
"@typescript-eslint/visitor-keys" "8.18.2"
"@typescript-eslint/scope-manager" "8.19.0"
"@typescript-eslint/type-utils" "8.19.0"
"@typescript-eslint/utils" "8.19.0"
"@typescript-eslint/visitor-keys" "8.19.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.2.tgz#0379a2e881d51d8fcf7ebdfa0dd18eee79182ce2"
integrity sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.19.0.tgz#f1512e6e5c491b03aabb2718b95becde22b15292"
integrity sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==
dependencies:
"@typescript-eslint/scope-manager" "8.18.2"
"@typescript-eslint/types" "8.18.2"
"@typescript-eslint/typescript-estree" "8.18.2"
"@typescript-eslint/visitor-keys" "8.18.2"
"@typescript-eslint/scope-manager" "8.19.0"
"@typescript-eslint/types" "8.19.0"
"@typescript-eslint/typescript-estree" "8.19.0"
"@typescript-eslint/visitor-keys" "8.19.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@8.18.2":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.2.tgz#d193c200d61eb0ddec5987c8e48c9d4e1c0510bd"
integrity sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==
"@typescript-eslint/scope-manager@8.19.0":
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.19.0.tgz#28fa413a334f70e8b506a968531e0a7c9c3076dc"
integrity sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==
dependencies:
"@typescript-eslint/types" "8.18.2"
"@typescript-eslint/visitor-keys" "8.18.2"
"@typescript-eslint/types" "8.19.0"
"@typescript-eslint/visitor-keys" "8.19.0"
"@typescript-eslint/type-utils@8.18.2":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.2.tgz#5ad07e09002eee237591881df674c1c0c91ca52f"
integrity sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==
"@typescript-eslint/type-utils@8.19.0":
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.19.0.tgz#41abd7d2e4cf93b6854b1fe6cbf416fab5abf89f"
integrity sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==
dependencies:
"@typescript-eslint/typescript-estree" "8.18.2"
"@typescript-eslint/utils" "8.18.2"
"@typescript-eslint/typescript-estree" "8.19.0"
"@typescript-eslint/utils" "8.19.0"
debug "^4.3.4"
ts-api-utils "^1.3.0"
"@typescript-eslint/types@8.18.2":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.2.tgz#5ebad5b384c8aa1c0f86cee1c61bcdbe7511f547"
integrity sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==
"@typescript-eslint/types@8.19.0":
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.19.0.tgz#a190a25c5484a42b81eaad06989579fdeb478cbb"
integrity sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==
"@typescript-eslint/typescript-estree@8.18.2":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.2.tgz#fffb85527f8304e29bfbbdc712f4515da9f8b47c"
integrity sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==
"@typescript-eslint/typescript-estree@8.19.0":
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.0.tgz#6b4f48f98ffad6597379951b115710f4d68c9ccb"
integrity sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==
dependencies:
"@typescript-eslint/types" "8.18.2"
"@typescript-eslint/visitor-keys" "8.18.2"
"@typescript-eslint/types" "8.19.0"
"@typescript-eslint/visitor-keys" "8.19.0"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
@@ -4012,22 +4012,22 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/utils@8.18.2", "@typescript-eslint/utils@^8.8.1":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.2.tgz#a2635f71904a84f9e47fe1b6f65a6d944ff1adf9"
integrity sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==
"@typescript-eslint/utils@8.19.0", "@typescript-eslint/utils@^8.8.1":
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.19.0.tgz#33824310e1fccc17f27fbd1030fd8bbd9a674684"
integrity sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
"@typescript-eslint/scope-manager" "8.18.2"
"@typescript-eslint/types" "8.18.2"
"@typescript-eslint/typescript-estree" "8.18.2"
"@typescript-eslint/scope-manager" "8.19.0"
"@typescript-eslint/types" "8.19.0"
"@typescript-eslint/typescript-estree" "8.19.0"
"@typescript-eslint/visitor-keys@8.18.2":
version "8.18.2"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.2.tgz#b3e434b701f086b10a7c82416ebc56899d27ef2f"
integrity sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==
"@typescript-eslint/visitor-keys@8.19.0":
version "8.19.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.0.tgz#dc313f735e64c4979c9073f51ffcefb6d9be5c77"
integrity sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==
dependencies:
"@typescript-eslint/types" "8.18.2"
"@typescript-eslint/types" "8.19.0"
eslint-visitor-keys "^4.2.0"
"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0":
@@ -5275,9 +5275,9 @@ concat-map@0.0.1:
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
concurrently@^9.0.1:
version "9.1.1"
resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.1.tgz#609dde2ce12f4f12d6a5ea6eace4c38bb7ab2ead"
integrity sha512-6VX8lrBIycgZKTwBsWS+bLrmkGRkDmvtGsYylRN9b93CygN6CbK46HmnQ3rdSOR8HRjdahDrxb5MqD9cEFOg5Q==
version "9.1.2"
resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.2.tgz#22d9109296961eaee773e12bfb1ce9a66bc9836c"
integrity sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==
dependencies:
chalk "^4.1.2"
lodash "^4.17.21"
@@ -6125,13 +6125,14 @@ es-object-atoms@^1.0.0:
es-errors "^1.3.0"
es-set-tostringtag@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
version "2.1.0"
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
dependencies:
get-intrinsic "^1.2.4"
es-errors "^1.3.0"
get-intrinsic "^1.2.6"
has-tostringtag "^1.0.2"
hasown "^2.0.1"
hasown "^2.0.2"
es-shim-unscopables@^1.0.2:
version "1.0.2"
@@ -7197,7 +7198,7 @@ hasha@^5.0.0:
is-stream "^2.0.0"
type-fest "^0.8.0"
hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
hasown@^2.0.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==
@@ -12151,9 +12152,9 @@ yaml@^1.10.0:
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yaml@^2.3.4:
version "2.6.1"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773"
integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==
version "2.7.0"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98"
integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==
yargs-parser@^18.1.2:
version "18.1.3"