From 5406855e1c1850c43ec21437351f933ba7e1a78d Mon Sep 17 00:00:00 2001 From: yuta Date: Wed, 12 Aug 2026 00:24:55 +0900 Subject: [PATCH] test(e2e): generate relay fixture types from OpenAPI --- README.md | 16 +- e2e/fixtures/twitter.ts | 35 + e2e/generated/twitter-openapi/client.ts | 2849 +++++++++++++++++++++++ e2e/mock-relay.mjs | 15 +- orval.config.ts | 75 + package.json | 8 + playwright.config.ts | 2 +- pnpm-lock.yaml | 1134 ++++++++- 8 files changed, 4090 insertions(+), 44 deletions(-) create mode 100644 e2e/fixtures/twitter.ts create mode 100644 e2e/generated/twitter-openapi/client.ts create mode 100644 orval.config.ts diff --git a/README.md b/README.md index efefd95..5c3a0d3 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ sent to the browser. ```bash nix develop -c pnpm dev nix develop -c pnpm dev:tailscale +nix develop -c pnpm generate:e2e-openapi nix develop -c pnpm knip nix develop -c pnpm test nix develop -c pnpm test:e2e @@ -79,8 +80,19 @@ nix develop -c pnpm start `test:e2e` is intentionally Nix-only and uses the system Chromium supplied by the dev shell. Browser tests are organized under `e2e/`: page object models and fixtures are shared by integration flows and Axe checks for WCAG 2.0/2.1 -A and AA. `test:live` is an explicit, opt-in smoke test that performs exactly -one read-only Top search using the configured relay. +A and AA. The tests keep a standalone HTTP relay so TanStack Start server +functions and SSR requests exercise the same network boundary as production. +The API client and fixture types are generated with Orval from a pinned +[twitter-openapi specification](https://github.com/fa0311/twitter-openapi/commit/590dae5c9f8575abc91d3774946bfe6f23960aba); +run `generate:e2e-openapi` only when updating that pin or the selected +operations. Generated files are committed, so normal E2E runs do not require +network access. E2E fixtures use the generated response types but stay +deterministic. Runtime requests continue through Bird because its transport +differs from the upstream OpenAPI client. Relay-only endpoints, request +transport differences, cursors, and stateful failure scenarios remain in the +handwritten mock server. +`test:live` is an explicit, opt-in smoke test that performs exactly one +read-only Top search using the configured relay. Development binds to `127.0.0.1` by default. `dev:tailscale` binds to `0.0.0.0`, so it exposes the app on LAN interfaces as well as Tailscale. Use it diff --git a/e2e/fixtures/twitter.ts b/e2e/fixtures/twitter.ts new file mode 100644 index 0000000..99e4e4d --- /dev/null +++ b/e2e/fixtures/twitter.ts @@ -0,0 +1,35 @@ +import type { TweetLegacy } from '../generated/twitter-openapi/client.ts' + +interface TweetLegacyFixtureOptions { + conversationId?: string + inReplyTo?: string + replyCount?: number +} + +export const tweetLegacyFixture = ( + id: string, + text: string, + { + conversationId = id, + inReplyTo, + replyCount = 1, + }: TweetLegacyFixtureOptions = {}, +): TweetLegacy => ({ + bookmark_count: 0, + bookmarked: false, + conversation_id_str: conversationId, + created_at: 'Mon Jul 13 00:00:00 +0000 2026', + display_text_range: [0, text.length], + favorite_count: 3, + favorited: false, + full_text: text, + id_str: id, + ...(inReplyTo ? { in_reply_to_status_id_str: inReplyTo } : {}), + is_quote_status: false, + lang: 'ja', + quote_count: 0, + reply_count: replyCount, + retweet_count: 2, + retweeted: false, + user_id_str: '42', +}) diff --git a/e2e/generated/twitter-openapi/client.ts b/e2e/generated/twitter-openapi/client.ts new file mode 100644 index 0000000..6b805f7 --- /dev/null +++ b/e2e/generated/twitter-openapi/client.ts @@ -0,0 +1,2849 @@ +/** + * Generated by orval 🍺 + * Do not edit manually. + * Twitter OpenAPI + * Twitter OpenAPI(Swagger) specification + * OpenAPI spec version: 0.0.1 + */ +export type TypeName = (typeof TypeName)[keyof typeof TypeName] + +export const TypeName = { + TimelineTweet: 'TimelineTweet', + TimelineTimelineItem: 'TimelineTimelineItem', + TimelineUser: 'TimelineUser', + TimelineTimelineCursor: 'TimelineTimelineCursor', + TweetWithVisibilityResults: 'TweetWithVisibilityResults', + ContextualTweetInterstitial: 'ContextualTweetInterstitial', + TimelineTimelineModule: 'TimelineTimelineModule', + TweetTombstone: 'TweetTombstone', + TimelinePrompt: 'TimelinePrompt', + TimelineMessagePrompt: 'TimelineMessagePrompt', + TimelineCommunity: 'TimelineCommunity', + TimelineTombstone: 'TimelineTombstone', + TimelineTrend: 'TimelineTrend', + TimelineNotification: 'TimelineNotification', + TimelineNotificationAggregateUserActions: + 'TimelineNotificationAggregateUserActions', + TweetUnavailable: 'TweetUnavailable', + TweetPreviewDisplay: 'TweetPreviewDisplay', + Tweet: 'Tweet', + User: 'User', + UserUnavailable: 'UserUnavailable', + Community: 'Community', + CommunityDeleteActionUnavailable: 'CommunityDeleteActionUnavailable', + CommunityJoinAction: 'CommunityJoinAction', + CommunityJoinActionUnavailable: 'CommunityJoinActionUnavailable', + CommunityLeaveActionUnavailable: 'CommunityLeaveActionUnavailable', + CommunityTweetPinActionUnavailable: 'CommunityTweetPinActionUnavailable', + CommunityTweetUnpinActionUnavailable: 'CommunityTweetUnpinActionUnavailable', + CommunityInvitesUnavailable: 'CommunityInvitesUnavailable', + CommunityJoinRequestsUnavailable: 'CommunityJoinRequestsUnavailable', + CommunityUnavailable: 'CommunityUnavailable', + ApiImage: 'ApiImage', + TimelineRichTextUser: 'TimelineRichTextUser', +} as const + +export type ClientEventInfoDetails = { [key: string]: unknown } + +export interface ClientEventInfo { + component?: string + details?: ClientEventInfoDetails + element?: string +} + +export type ContentEntryType = + (typeof ContentEntryType)[keyof typeof ContentEntryType] + +export const ContentEntryType = { + TimelineTimelineItem: 'TimelineTimelineItem', + TimelineTimelineCursor: 'TimelineTimelineCursor', + TimelineTimelineModule: 'TimelineTimelineModule', +} as const + +export interface TextHighlight { + endIndex: number + startIndex: number +} + +export interface Highlight { + textHighlights: TextHighlight[] +} + +export type ContentItemType = + (typeof ContentItemType)[keyof typeof ContentItemType] + +export const ContentItemType = { + TimelineTweet: 'TimelineTweet', + TimelineTimelineCursor: 'TimelineTimelineCursor', + TimelineUser: 'TimelineUser', + TimelinePrompt: 'TimelinePrompt', + TimelineMessagePrompt: 'TimelineMessagePrompt', + TimelineCommunity: 'TimelineCommunity', + TimelineTombstone: 'TimelineTombstone', + TimelineTrend: 'TimelineTrend', + TimelineNotification: 'TimelineNotification', +} as const + +export type TimelineGeneralContextContextType = + (typeof TimelineGeneralContextContextType)[keyof typeof TimelineGeneralContextContextType] + +export const TimelineGeneralContextContextType = { + Follow: 'Follow', + Pin: 'Pin', + Like: 'Like', + Location: 'Location', + Sparkle: 'Sparkle', + Conversation: 'Conversation', + List: 'List', + Community: 'Community', + Facepile: 'Facepile', +} as const + +export type SocialContextLandingUrlUrlType = + (typeof SocialContextLandingUrlUrlType)[keyof typeof SocialContextLandingUrlUrlType] + +export const SocialContextLandingUrlUrlType = { + DeepLink: 'DeepLink', + UrtEndpoint: 'UrtEndpoint', + ExternalUrl: 'ExternalUrl', +} as const + +export interface UrtEndpointRequestParams { + key: string + value: string +} + +export interface UrtEndpointOptions { + requestParams: UrtEndpointRequestParams[] + title: string +} + +export interface SocialContextLandingUrl { + url?: string + urlType?: SocialContextLandingUrlUrlType + urtEndpointOptions?: UrtEndpointOptions +} + +export type SocialContextUnionType = + (typeof SocialContextUnionType)[keyof typeof SocialContextUnionType] + +export const SocialContextUnionType = { + TimelineGeneralContext: 'TimelineGeneralContext', + TimelineTopicContext: 'TimelineTopicContext', +} as const + +export interface TimelineGeneralContext { + contextImageUrls?: string[] + contextType?: TimelineGeneralContextContextType + landingUrl?: SocialContextLandingUrl + text?: string + type?: SocialContextUnionType +} + +export type TimelineTopicContextFunctionalityType = + (typeof TimelineTopicContextFunctionalityType)[keyof typeof TimelineTopicContextFunctionalityType] + +export const TimelineTopicContextFunctionalityType = { + Basic: 'Basic', +} as const + +export interface TopicContext { + description?: string + following?: boolean + icon_url?: string + id?: string + name?: string + not_interested?: boolean + topic_id?: string +} + +export interface TimelineTopicContext { + functionalityType?: TimelineTopicContextFunctionalityType + topic?: TopicContext + type?: SocialContextUnionType +} + +export type SocialContextUnion = TimelineGeneralContext | TimelineTopicContext + +export type TimelineTweetTweetDisplayType = + (typeof TimelineTweetTweetDisplayType)[keyof typeof TimelineTweetTweetDisplayType] + +export const TimelineTweetTweetDisplayType = { + Tweet: 'Tweet', + SelfThread: 'SelfThread', + MediaGrid: 'MediaGrid', + CondensedTweet: 'CondensedTweet', +} as const + +export interface ArticleCoverMediaColorInfoPaletteRGB { + blue: number + green: number + red: number +} + +export interface ArticleCoverMediaColorInfoPalette { + percentage: number + rgb: ArticleCoverMediaColorInfoPaletteRGB +} + +export interface ArticleCoverMediaColorInfo { + palette: ArticleCoverMediaColorInfoPalette[] +} + +export interface ArticleCoverMediaInfo { + __typename?: TypeName + color_info: ArticleCoverMediaColorInfo + original_img_height: number + original_img_url: string + original_img_width: number +} + +export interface ArticleCoverMedia { + id: string + /** @pattern ^[0-9]+$ */ + media_id: string + media_info: ArticleCoverMediaInfo + media_key: string +} + +export interface ArticleLifecycleState { + modified_at_secs: number +} + +export interface ArticleMetadata { + first_published_at_secs: number +} + +export type ArticleResultContentState = { [key: string]: unknown } + +export interface ArticleResult { + content_state?: ArticleResultContentState + cover_media?: ArticleCoverMedia + id: string + is_grok_summary_eligible?: boolean + lifecycle_state?: ArticleLifecycleState + media_entities?: ArticleCoverMedia[] + metadata: ArticleMetadata + preview_text: string + /** @pattern ^[0-9]+$ */ + rest_id: string + title: string +} + +export interface ArticleResults { + result: ArticleResult +} + +export interface Article { + article_results: ArticleResults +} + +export type CommunityDeleteActionResultReason = + (typeof CommunityDeleteActionResultReason)[keyof typeof CommunityDeleteActionResultReason] + +export const CommunityDeleteActionResultReason = { + Unavailable: 'Unavailable', +} as const + +export interface CommunityDeleteActionResult { + __typename: TypeName + reason: CommunityDeleteActionResultReason +} + +export type _CommunityJoinActionTypename = + (typeof _CommunityJoinActionTypename)[keyof typeof _CommunityJoinActionTypename] + +export const _CommunityJoinActionTypename = { + CommunityJoinAction: 'CommunityJoinAction', +} as const + +export interface CommunityJoinAction { + __typename: _CommunityJoinActionTypename +} + +export type _CommunityJoinActionUnavailableTypename = + (typeof _CommunityJoinActionUnavailableTypename)[keyof typeof _CommunityJoinActionUnavailableTypename] + +export const _CommunityJoinActionUnavailableTypename = { + CommunityJoinActionUnavailable: 'CommunityJoinActionUnavailable', +} as const + +export type CommunityJoinActionUnavailableReason = + (typeof CommunityJoinActionUnavailableReason)[keyof typeof CommunityJoinActionUnavailableReason] + +export const CommunityJoinActionUnavailableReason = { + ViewerRequestRequired: 'ViewerRequestRequired', +} as const + +export interface CommunityJoinActionUnavailable { + __typename: _CommunityJoinActionUnavailableTypename + message: string + reason: CommunityJoinActionUnavailableReason +} + +export type CommunityJoinActionResultUnion = + | CommunityJoinAction + | CommunityJoinActionUnavailable + +export type CommunityLeaveActionResultReason = + (typeof CommunityLeaveActionResultReason)[keyof typeof CommunityLeaveActionResultReason] + +export const CommunityLeaveActionResultReason = { + ViewerNotMember: 'ViewerNotMember', +} as const + +export interface CommunityLeaveActionResult { + __typename: TypeName + message: string + reason: CommunityLeaveActionResultReason +} + +export interface CommunityPinActionResult { + __typename: TypeName +} + +export interface CommunityUnpinActionResult { + __typename: TypeName +} + +export interface CommunityActions { + delete_action_result?: CommunityDeleteActionResult + join_action_result?: CommunityJoinActionResultUnion + leave_action_result?: CommunityLeaveActionResult + pin_action_result?: CommunityPinActionResult + unpin_action_result?: CommunityUnpinActionResult +} + +export interface UserAvatar { + image_url: string +} + +/** + * @pattern ^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0-3])(: ?)([0-5][0-9])(: ?)([0-5][0-9]) ([+-][0-9]{4}) ([0-9]{4})$ + */ +export type TwitterTimeFormat = string + +export interface UserCore { + created_at: TwitterTimeFormat + name: string + screen_name: string +} + +export interface UserDmPermissions { + can_dm: boolean +} + +export interface UserHighlightsInfo { + can_highlight_tweets: boolean + highlighted_tweets: string +} + +export type UserLegacyVerifiedType = + (typeof UserLegacyVerifiedType)[keyof typeof UserLegacyVerifiedType] + +export const UserLegacyVerifiedType = { + Business: 'Business', + Government: 'Government', +} as const + +export type UserLegacyEntities = { [key: string]: unknown } + +export type UserLegacyProfileBannerExtensions = { [key: string]: unknown } + +export type UserLegacyProfileImageExtensions = { [key: string]: unknown } + +export interface UserLegacy { + blocked_by?: boolean + blocking?: boolean + can_dm?: boolean + can_media_tag?: boolean + created_at?: TwitterTimeFormat + default_profile: boolean + default_profile_image: boolean + description: string + entities: UserLegacyEntities + fast_followers_count: number + favourites_count: number + follow_request_sent?: boolean + followed_by?: boolean + followers_count: number + following?: boolean + friends_count: number + has_custom_timelines: boolean + is_translator: boolean + listed_count: number + location?: string + media_count: number + muting?: boolean + name?: string + normal_followers_count: number + notifications?: boolean + pinned_tweet_ids_str?: string[] + possibly_sensitive: boolean + profile_banner_extensions?: UserLegacyProfileBannerExtensions + profile_banner_url?: string + profile_image_extensions?: UserLegacyProfileImageExtensions + profile_image_url_https?: string + profile_interstitial_type: string + protected?: boolean + screen_name?: string + statuses_count: number + time_zone: string + translator_type: string + url?: string + utc_offset: number + verified?: boolean + verified_type?: UserLegacyVerifiedType + want_retweets?: boolean + withheld_description: string + withheld_in_countries?: string[] + withheld_scope: string +} + +export type UserLegacyExtendedProfileBirthdateVisibility = + (typeof UserLegacyExtendedProfileBirthdateVisibility)[keyof typeof UserLegacyExtendedProfileBirthdateVisibility] + +export const UserLegacyExtendedProfileBirthdateVisibility = { + Self: 'Self', + Public: 'Public', + MutualFollow: 'MutualFollow', + Followers: 'Followers', + Following: 'Following', +} as const + +export type UserLegacyExtendedProfileBirthdateYearVisibility = + (typeof UserLegacyExtendedProfileBirthdateYearVisibility)[keyof typeof UserLegacyExtendedProfileBirthdateYearVisibility] + +export const UserLegacyExtendedProfileBirthdateYearVisibility = { + Self: 'Self', + Public: 'Public', + MutualFollow: 'MutualFollow', + Followers: 'Followers', + Following: 'Following', +} as const + +export interface UserLegacyExtendedProfileBirthdate { + day: number + month: number + visibility: UserLegacyExtendedProfileBirthdateVisibility + year?: number + year_visibility: UserLegacyExtendedProfileBirthdateYearVisibility +} + +export interface UserLegacyExtendedProfile { + birthdate?: UserLegacyExtendedProfileBirthdate +} + +export interface UserLocation { + location: string +} + +export interface UserMediaPermissions { + can_media_tag: boolean +} + +export type UserParodyCommentaryFanLabel = + (typeof UserParodyCommentaryFanLabel)[keyof typeof UserParodyCommentaryFanLabel] + +export const UserParodyCommentaryFanLabel = { + None: 'None', + Parody: 'Parody', + Commentary: 'Commentary', + Fan: 'Fan', +} as const + +export interface UserPrivacy { + protected: boolean +} + +export interface UserProfessionalCategory { + icon_name: string + id: number + name: string +} + +export type UserProfessionalProfessionalType = + (typeof UserProfessionalProfessionalType)[keyof typeof UserProfessionalProfessionalType] + +export const UserProfessionalProfessionalType = { + Business: 'Business', + Creator: 'Creator', +} as const + +export interface UserProfessional { + category?: UserProfessionalCategory[] + professional_type: UserProfessionalProfessionalType + /** @pattern ^[0-9]+$ */ + rest_id: string +} + +export interface ProfileBio { + description: string +} + +export type UserProfileImageShape = + (typeof UserProfileImageShape)[keyof typeof UserProfileImageShape] + +export const UserProfileImageShape = { + Circle: 'Circle', + Square: 'Square', + Hexagon: 'Hexagon', +} as const + +export interface UserRelationshipPerspectives { + blocked_by?: boolean + blocking?: boolean + followed_by?: boolean + following?: boolean +} + +export interface SuperFollowUserProfile { + is_active: boolean +} + +export interface UserProfile { + super_follows_user_profile: SuperFollowUserProfile +} + +export interface UserTipJarSettings { + bandcamp_handle?: string + bitcoin_handle?: string + cash_app_handle?: string + ethereum_handle?: string + gofundme_handle?: string + is_enabled?: boolean + patreon_handle?: string + pay_pal_handle?: string + venmo_handle?: string +} + +export type UserVerificationVerifiedType = + (typeof UserVerificationVerifiedType)[keyof typeof UserVerificationVerifiedType] + +export const UserVerificationVerifiedType = { + Business: 'Business', + Government: 'Government', +} as const + +export interface UserVerification { + verified: boolean + verified_type?: UserVerificationVerifiedType +} + +export type UserVerificationInfoReasonDescriptionEntitiesRefUrlType = + (typeof UserVerificationInfoReasonDescriptionEntitiesRefUrlType)[keyof typeof UserVerificationInfoReasonDescriptionEntitiesRefUrlType] + +export const UserVerificationInfoReasonDescriptionEntitiesRefUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface UserVerificationInfoReasonDescriptionEntitiesRef { + url: string + url_type: UserVerificationInfoReasonDescriptionEntitiesRefUrlType +} + +export interface UserVerificationInfoReasonDescriptionEntities { + from_index: number + ref: UserVerificationInfoReasonDescriptionEntitiesRef + to_index: number +} + +export interface UserVerificationInfoReasonDescription { + entities: UserVerificationInfoReasonDescriptionEntities[] + text: string +} + +export interface UserVerificationInfoReason { + description: UserVerificationInfoReasonDescription + override_verified_year?: number + /** @pattern ^-?[0-9]+$ */ + verified_since_msec: string +} + +export interface UserVerificationInfo { + is_identity_verified: boolean + reason?: UserVerificationInfoReason +} + +export type UserAffiliatesHighlightedLabel = { [key: string]: unknown } + +export type UserBusinessAccount = { [key: string]: unknown } + +export interface User { + __typename: TypeName + affiliates_highlighted_label?: UserAffiliatesHighlightedLabel + avatar?: UserAvatar + business_account?: UserBusinessAccount + core?: UserCore + creator_subscriptions_count?: number + dm_permissions?: UserDmPermissions + has_graduated_access?: boolean + has_hidden_likes_on_profile?: boolean + has_hidden_subscriptions_on_profile?: boolean + has_nft_avatar?: boolean + highlights_info?: UserHighlightsInfo + /** @pattern ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$ */ + id: string + is_blue_verified: boolean + is_profile_translatable?: boolean + legacy: UserLegacy + legacy_extended_profile?: UserLegacyExtendedProfile + location?: UserLocation + media_permissions?: UserMediaPermissions + parody_commentary_fan_label?: UserParodyCommentaryFanLabel + premium_gifting_eligible?: boolean + privacy?: UserPrivacy + professional?: UserProfessional + profile_bio?: ProfileBio + profile_description_language?: string + profile_image_shape: UserProfileImageShape + profile_sort_enabled?: boolean + relationship_perspectives?: UserRelationshipPerspectives + /** @pattern ^[0-9]+$ */ + rest_id: string + super_follow_eligible?: boolean + super_followed_by?: boolean + super_following?: boolean + super_follows_user_profile?: UserProfile + tipjar_settings?: UserTipJarSettings + user_seed_tweet_count?: number + verification?: UserVerification + verification_info?: UserVerificationInfo + verified_user_profiles?: UserProfile +} + +export interface UserUnavailable { + __typename: TypeName + message?: string + reason: string +} + +export type UserUnion = User | UserUnavailable + +export interface UserResults { + result?: UserUnion +} + +export type CommunityInvitesPolicy = + (typeof CommunityInvitesPolicy)[keyof typeof CommunityInvitesPolicy] + +export const CommunityInvitesPolicy = { + MemberInvitesAllowed: 'MemberInvitesAllowed', + ModeratorInvitesAllowed: 'ModeratorInvitesAllowed', +} as const + +export type CommunityInvitesResultReason = + (typeof CommunityInvitesResultReason)[keyof typeof CommunityInvitesResultReason] + +export const CommunityInvitesResultReason = { + Unavailable: 'Unavailable', +} as const + +export interface CommunityInvitesResult { + __typename: TypeName + message: string + reason: CommunityInvitesResultReason +} + +export type CommunityJoinPolicy = + (typeof CommunityJoinPolicy)[keyof typeof CommunityJoinPolicy] + +export const CommunityJoinPolicy = { + Open: 'Open', + RestrictedJoinRequestsRequireModeratorApproval: + 'RestrictedJoinRequestsRequireModeratorApproval', +} as const + +export interface CommunityJoinRequestsResult { + __typename: TypeName +} + +export interface PrimaryCommunityTopic { + /** @pattern ^[0-9]+$ */ + topic_id: string + topic_name: string +} + +export type CommunityRole = (typeof CommunityRole)[keyof typeof CommunityRole] + +export const CommunityRole = { + NonMember: 'NonMember', +} as const + +export interface CommunityRule { + description?: string + name: string + /** @pattern ^[0-9]+$ */ + rest_id: string +} + +export interface CommunityUrlsPermalink { + url: string +} + +export interface CommunityUrls { + permalink: CommunityUrlsPermalink +} + +export type CommunityCustomBannerMedia = { [key: string]: unknown } + +export type CommunityDefaultBannerMedia = { [key: string]: unknown } + +export type CommunityViewerRelationship = { [key: string]: unknown } + +export interface Community { + __typename: TypeName + actions?: CommunityActions + admin_results?: UserResults + created_at?: number + creator_results?: UserResults + custom_banner_media?: CommunityCustomBannerMedia + default_banner_media?: CommunityDefaultBannerMedia + description?: string + /** @pattern ^[0-9]+$ */ + id_str?: string + invites_policy?: CommunityInvitesPolicy + invites_result?: CommunityInvitesResult + is_pinned?: boolean + join_policy?: CommunityJoinPolicy + join_requests_result?: CommunityJoinRequestsResult + member_count?: number + members_facepile_results?: UserResults[] + moderator_count?: number + name?: string + primary_community_topic?: PrimaryCommunityTopic + question?: string + role?: CommunityRole + rules?: CommunityRule[] + search_tags?: string[] + show_only_users_to_display?: string[] + urls?: CommunityUrls + viewer_relationship?: CommunityViewerRelationship +} + +export interface CommunityUnavailable { + __typename: TypeName +} + +export type CommunityUnion = Community | CommunityUnavailable + +export interface CommunityResult { + result: CommunityUnion +} + +export type AuthorCommunityRelationshipRole = + (typeof AuthorCommunityRelationshipRole)[keyof typeof AuthorCommunityRelationshipRole] + +export const AuthorCommunityRelationshipRole = { + Member: 'Member', + Moderator: 'Moderator', + Admin: 'Admin', + NonMember: 'NonMember', +} as const + +export interface AuthorCommunityRelationship { + community_results: CommunityResult + role?: AuthorCommunityRelationshipRole + user_results?: UserResults +} + +export interface BirdwatchPivotCallToAction { + destinationUrl: string + prompt: string + title: string +} + +export type BirdwatchEntityRefType = + (typeof BirdwatchEntityRefType)[keyof typeof BirdwatchEntityRefType] + +export const BirdwatchEntityRefType = { + TimelineUrl: 'TimelineUrl', + TimelineRichTextHashtag: 'TimelineRichTextHashtag', +} as const + +export type BirdwatchEntityRefUrlType = + (typeof BirdwatchEntityRefUrlType)[keyof typeof BirdwatchEntityRefUrlType] + +export const BirdwatchEntityRefUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface BirdwatchEntityRef { + text?: string + type: BirdwatchEntityRefType + url?: string + urlType?: BirdwatchEntityRefUrlType +} + +export interface BirdwatchEntity { + fromIndex: number + ref: BirdwatchEntityRef + toIndex: number +} + +export interface BirdwatchPivotFooter { + entities: BirdwatchEntity[] + text: string +} + +export type BirdwatchPivotFooterIconType = + (typeof BirdwatchPivotFooterIconType)[keyof typeof BirdwatchPivotFooterIconType] + +export const BirdwatchPivotFooterIconType = { + BirdwatchEyeOff: 'BirdwatchEyeOff', +} as const + +export type BirdwatchPivotIconType = + (typeof BirdwatchPivotIconType)[keyof typeof BirdwatchPivotIconType] + +export const BirdwatchPivotIconType = { + BirdwatchV1Icon: 'BirdwatchV1Icon', + BirdwatchCameraVideo: 'BirdwatchCameraVideo', +} as const + +export type GrokEntityRefType = + (typeof GrokEntityRefType)[keyof typeof GrokEntityRefType] + +export const GrokEntityRefType = { + TimelineUrl: 'TimelineUrl', + TimelineRichTextHashtag: 'TimelineRichTextHashtag', +} as const + +export type GrokEntityRefUrlType = + (typeof GrokEntityRefUrlType)[keyof typeof GrokEntityRefUrlType] + +export const GrokEntityRefUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface GrokEntityRef { + display_url?: string + expanded_url?: string + text?: string + type: GrokEntityRefType + url?: string + url_type?: GrokEntityRefUrlType +} + +export interface GrokEntity { + from_index: string + ref: GrokEntityRef + to_index: string +} + +export interface GrokTranslatedCommunityNote { + destination_language: string + rich_text_entities?: GrokEntity[] + source_language: string + translation: string + translation_available: boolean +} + +export interface GrokTranslatedCommunityNoteWithAvailability { + data?: GrokTranslatedCommunityNote + is_available: boolean +} + +export interface BirdwatchPivotNote { + grok_translated_community_note_with_availability?: GrokTranslatedCommunityNoteWithAvailability + is_community_note_translatable?: boolean + language?: string + /** @pattern ^[0-9]+$ */ + rest_id: string +} + +export interface BirdwatchPivotSubtitle { + entities: BirdwatchEntity[] + text: string +} + +export type BirdwatchPivotVisualStyle = + (typeof BirdwatchPivotVisualStyle)[keyof typeof BirdwatchPivotVisualStyle] + +export const BirdwatchPivotVisualStyle = { + Default: 'Default', + Tentative: 'Tentative', +} as const + +export interface BirdwatchPivot { + callToAction?: BirdwatchPivotCallToAction + destinationUrl: string + footer?: BirdwatchPivotFooter + footerIconType?: BirdwatchPivotFooterIconType + iconType: BirdwatchPivotIconType + note?: BirdwatchPivotNote + shorttitle?: string + subtitle?: BirdwatchPivotSubtitle + title: string + titleDetail?: string + visualStyle?: BirdwatchPivotVisualStyle +} + +export interface TweetCardLegacyBindingValueDataImage { + alt?: string + height: number + url: string + width: number +} + +export interface UserValue { + /** @pattern ^[0-9]+$ */ + id_str: string +} + +export type TweetCardLegacyBindingValueDataImageColorValue = { + [key: string]: unknown +} + +export interface TweetCardLegacyBindingValueData { + boolean_value?: boolean + image_color_value?: TweetCardLegacyBindingValueDataImageColorValue + image_value?: TweetCardLegacyBindingValueDataImage + scribe_key?: string + string_value?: string + type: string + user_value?: UserValue +} + +export interface TweetCardLegacyBindingValue { + key: string + value: TweetCardLegacyBindingValueData +} + +export type TweetCardPlatformAudienceName = + (typeof TweetCardPlatformAudienceName)[keyof typeof TweetCardPlatformAudienceName] + +export const TweetCardPlatformAudienceName = { + production: 'production', +} as const + +export interface TweetCardPlatformAudience { + name: TweetCardPlatformAudienceName +} + +export interface TweetCardPlatformDevice { + name: string + /** @pattern ^[0-9]+$ */ + version: string +} + +export interface TweetCardPlatform { + audience: TweetCardPlatformAudience + device: TweetCardPlatformDevice +} + +export interface TweetCardPlatformData { + platform: TweetCardPlatform +} + +export interface TweetCardLegacy { + binding_values: TweetCardLegacyBindingValue[] + card_platform?: TweetCardPlatformData + name: string + url: string + user_refs_results?: UserResults[] +} + +export interface TweetCard { + legacy?: TweetCardLegacy + rest_id?: string +} + +export type CommunityRelationshipModerationState = { [key: string]: unknown } + +export interface CommunityRelationship { + actions: CommunityActions + id: string + moderation_state: CommunityRelationshipModerationState + /** @pattern ^[0-9]+$ */ + rest_id: string +} + +export interface ContentDisclosureAdvertisingDisclosure { + is_paid_promotion: boolean +} + +export type ContentDisclosureAiGeneratedDisclosureAiGeneratedDetectionSource = + (typeof ContentDisclosureAiGeneratedDisclosureAiGeneratedDetectionSource)[keyof typeof ContentDisclosureAiGeneratedDisclosureAiGeneratedDetectionSource] + +export const ContentDisclosureAiGeneratedDisclosureAiGeneratedDetectionSource = + { + C2paClient: 'C2paClient', + ContentDisclosureAiGeneratedDisclosure: + 'ContentDisclosureAiGeneratedDisclosure', + UserDeclared: 'UserDeclared', + } as const + +export interface ContentDisclosureAiGeneratedDisclosure { + ai_generated_detection_source?: ContentDisclosureAiGeneratedDisclosureAiGeneratedDetectionSource + can_edit: boolean + has_ai_generated_media: boolean +} + +export interface ContentDisclosure { + advertising_disclosure?: ContentDisclosureAdvertisingDisclosure + ai_generated_disclosure?: ContentDisclosureAiGeneratedDisclosure +} + +export interface UserResultCore { + user_results: UserResults +} + +export interface TweetEditControlInitial { + /** @items.pattern ^[0-9]+$ */ + edit_tweet_ids: string[] + /** @pattern ^[0-9]+$ */ + editable_until_msecs: string + /** @pattern ^[0-9]+$ */ + edits_remaining: string + is_edit_eligible: boolean +} + +export interface TweetEditControl { + edit_control_initial?: TweetEditControlInitial + /** @items.pattern ^[0-9]+$ */ + edit_tweet_ids?: string[] + /** @pattern ^[0-9]+$ */ + editable_until_msecs?: string + /** @pattern ^[0-9]+$ */ + edits_remaining?: string + /** @pattern ^[0-9]+$ */ + initial_tweet_id?: string + is_edit_eligible?: boolean +} + +export interface TweetEditPrespective { + favorited?: boolean + retweeted?: boolean +} + +export interface GrokAnnotation { + is_image_editable_by_grok?: boolean +} + +export interface AnalysisResults { + result: Tweet +} + +export type GrokShareAttachmentItemDeepsearchHeadersItem = { + [key: string]: unknown +} + +export interface GrokShareAttachmentItem { + analysis_post_id_results?: AnalysisResults + deepsearch_headers?: GrokShareAttachmentItemDeepsearchHeadersItem[] + media_urls: string[] + message: string +} + +export interface GrokShareAttachment { + items: GrokShareAttachmentItem[] +} + +export interface Hashtag { + [key: string]: unknown +} + +export interface AdditionalMediaInfoCallToActionsUrl { + url: string +} + +export interface AdditionalMediaInfoCallToActions { + visit_site?: AdditionalMediaInfoCallToActionsUrl + watch_now?: AdditionalMediaInfoCallToActionsUrl +} + +export interface AdditionalMediaInfo { + call_to_actions?: AdditionalMediaInfoCallToActions + description?: string + embeddable?: boolean + monetizable: boolean + source_user?: UserResultCore + title?: string +} + +export interface AllowDownloadStatus { + allow_download?: boolean +} + +export type ExtMediaAvailabilityStatus = + (typeof ExtMediaAvailabilityStatus)[keyof typeof ExtMediaAvailabilityStatus] + +export const ExtMediaAvailabilityStatus = { + Available: 'Available', + Unavailable: 'Unavailable', +} as const + +export interface ExtMediaAvailability { + reason?: string + status?: ExtMediaAvailabilityStatus +} + +export interface GrokImageAnnotation { + prompt: string + upsampled_prompt: string +} + +export interface MediaResult { + grok_image_annotation?: GrokImageAnnotation + media_key: string +} + +export interface MediaResults { + result: MediaResult +} + +export interface MediaOriginalInfoFocusRect { + h: number + w: number + x: number + y: number +} + +export interface MediaOriginalInfo { + focus_rects?: MediaOriginalInfoFocusRect[] + height: number + width: number +} + +export interface SensitiveMediaWarning { + adult_content?: boolean + graphic_violence?: boolean + other?: boolean +} + +export type MediaSizeResize = + (typeof MediaSizeResize)[keyof typeof MediaSizeResize] + +export const MediaSizeResize = { + crop: 'crop', + fit: 'fit', +} as const + +export interface MediaSize { + h: number + resize: MediaSizeResize + w: number +} + +export interface MediaSizes { + large: MediaSize + medium: MediaSize + small: MediaSize + thumb: MediaSize +} + +export type MediaType = (typeof MediaType)[keyof typeof MediaType] + +export const MediaType = { + photo: 'photo', + video: 'video', + animated_gif: 'animated_gif', +} as const + +export interface MediaVideoInfoVariant { + bitrate?: number + content_type: string + url: string +} + +export interface MediaVideoInfo { + aspect_ratio: number[] + duration_millis?: number + variants: MediaVideoInfoVariant[] +} + +export type MediaFeatures = { [key: string]: unknown } + +export interface Media { + additional_media_info?: AdditionalMediaInfo + allow_download_status?: AllowDownloadStatus + display_url: string + expanded_url: string + ext_alt_text?: string + ext_media_availability: ExtMediaAvailability + features?: MediaFeatures + grok_post_id?: string + /** @pattern ^[0-9]+$ */ + id_str: string + indices: number[] + media_key: string + media_results?: MediaResults + media_url_https: string + original_info: MediaOriginalInfo + sensitive_media_warning?: SensitiveMediaWarning + sizes: MediaSizes + /** @pattern ^[0-9]+$ */ + source_status_id_str?: string + /** @pattern ^[0-9]+$ */ + source_user_id_str?: string + type: MediaType + url: string + video_info?: MediaVideoInfo +} + +export type SmarttagTagInfo = { [key: string]: unknown } + +export interface SmarttagTag { + info: SmarttagTagInfo +} + +export interface Smarttag { + indices: number[] + tag: SmarttagTag + text: string +} + +export interface Symbol { + [key: string]: unknown +} + +export interface Timestamp { + indices: number[] + seconds: number + text: string +} + +export interface Url { + display_url: string + expanded_url?: string + indices: number[] + url: string +} + +export interface UserMention { + [key: string]: unknown +} + +export interface Entities { + hashtags?: Hashtag[] + media?: Media[] + smarttags?: Smarttag[] + symbols?: Symbol[] + timestamps?: Timestamp[] + urls?: Url[] + user_mentions?: UserMention[] +} + +export type GrokTranslatedPostAssociatedData = { [key: string]: unknown } + +export interface GrokTranslatedPost { + associated_data?: GrokTranslatedPostAssociatedData + destination_language?: string + entities?: Entities + preview_translation?: string + source_language?: string + translation?: string +} + +export interface GrokTranslatedPostWithAvailability { + data?: GrokTranslatedPost + is_available: boolean +} + +export interface MediaStats { + viewCount: number +} + +export type MediaExtendedType = + (typeof MediaExtendedType)[keyof typeof MediaExtendedType] + +export const MediaExtendedType = { + photo: 'photo', + video: 'video', + animated_gif: 'animated_gif', +} as const + +export type MediaExtendedFeatures = { [key: string]: unknown } + +export interface MediaExtended { + additional_media_info?: AdditionalMediaInfo + allow_download_status?: AllowDownloadStatus + display_url: string + expanded_url: string + ext_alt_text?: string + ext_media_availability?: ExtMediaAvailability + features?: MediaExtendedFeatures + grok_post_id?: string + /** @pattern ^[0-9]+$ */ + id_str: string + indices: number[] + mediaStats?: MediaStats + media_key: string + media_results?: MediaResults + media_url_https: string + original_info: MediaOriginalInfo + sensitive_media_warning?: SensitiveMediaWarning + sizes: MediaSizes + /** @pattern ^[0-9]+$ */ + source_status_id_str?: string + /** @pattern ^[0-9]+$ */ + source_user_id_str?: string + type: MediaExtendedType + url: string + video_info?: MediaVideoInfo +} + +export interface ExtendedEntities { + media: MediaExtended[] +} + +export type TweetLegacyLimitedActions = + (typeof TweetLegacyLimitedActions)[keyof typeof TweetLegacyLimitedActions] + +export const TweetLegacyLimitedActions = { + limited_replies: 'limited_replies', + non_compliant: 'non_compliant', + dynamic_product_ad: 'dynamic_product_ad', + stale_tweet: 'stale_tweet', + community_tweet_non_member_public_community: + 'community_tweet_non_member_public_community', + community_tweet_non_member_closed_community: + 'community_tweet_non_member_closed_community', + blocked_viewer: 'blocked_viewer', +} as const + +export interface QuotedStatusPermalink { + display: string + expanded: string + url: string +} + +export interface TweetLegacyScopes { + followers: boolean +} + +export interface SelfThread { + /** @pattern ^[0-9]+$ */ + id_str: string +} + +export type TweetLegacyConversationControl = { [key: string]: unknown } + +export type TweetLegacyPlace = { [key: string]: unknown } + +export interface TweetLegacy { + bookmark_count: number + bookmarked: boolean + conversation_control?: TweetLegacyConversationControl + /** @pattern ^[0-9]+$ */ + conversation_id_str: string + created_at: TwitterTimeFormat + display_text_range: number[] + entities?: Entities + extended_entities?: ExtendedEntities + favorite_count: number + favorited: boolean + full_text: string + /** @pattern ^[0-9]+$ */ + id_str: string + in_reply_to_screen_name?: string + /** @pattern ^[0-9]+$ */ + in_reply_to_status_id_str?: string + /** @pattern ^[0-9]+$ */ + in_reply_to_user_id_str?: string + is_quote_status: boolean + lang: string + limited_actions?: TweetLegacyLimitedActions + place?: TweetLegacyPlace + possibly_sensitive?: boolean + possibly_sensitive_editable?: boolean + quote_count: number + /** @pattern ^[0-9]+$ */ + quoted_status_id_str?: string + quoted_status_permalink?: QuotedStatusPermalink + reply_count: number + retweet_count: number + retweeted: boolean + retweeted_status_result?: ItemResult + scopes?: TweetLegacyScopes + self_thread?: SelfThread + /** @pattern ^[0-9]+$ */ + user_id_str: string +} + +export interface NoteTweetResultMediaInlineMedia { + index: number + /** @pattern ^[0-9]+$ */ + media_id: string +} + +export interface NoteTweetResultMedia { + inline_media: NoteTweetResultMediaInlineMedia[] +} + +export type NoteTweetResultRichTextTagRichtextTypesItem = + (typeof NoteTweetResultRichTextTagRichtextTypesItem)[keyof typeof NoteTweetResultRichTextTagRichtextTypesItem] + +export const NoteTweetResultRichTextTagRichtextTypesItem = { + Bold: 'Bold', + Italic: 'Italic', +} as const + +export interface NoteTweetResultRichTextTag { + from_index: number + richtext_types: NoteTweetResultRichTextTagRichtextTypesItem[] + to_index: number +} + +export interface NoteTweetResultRichText { + richtext_tags: NoteTweetResultRichTextTag[] +} + +export interface NoteTweetResultData { + entity_set: Entities + /** @pattern ^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$ */ + id: string + media?: NoteTweetResultMedia + richtext?: NoteTweetResultRichText + text: string +} + +export interface NoteTweetResult { + result: NoteTweetResultData +} + +export interface NoteTweet { + is_expandable?: boolean + note_tweet_results: NoteTweetResult +} + +export type TweetPostCtaDisplayLocationsItem = + (typeof TweetPostCtaDisplayLocationsItem)[keyof typeof TweetPostCtaDisplayLocationsItem] + +export const TweetPostCtaDisplayLocationsItem = { + TweetDetails: 'TweetDetails', + ForYouTimeline: 'ForYouTimeline', + RepliesTimeline: 'RepliesTimeline', +} as const + +export interface PostCtaUserResultsAvatar { + image_url: string +} + +export interface PostCtaUserResultsResult { + __typename: TypeName + avatar: PostCtaUserResultsAvatar +} + +export interface PostCtaUserResults { + result: PostCtaUserResultsResult +} + +export interface PostCtaTitleTextEntityRef { + __typename: TypeName + user_results?: PostCtaUserResults +} + +export interface PostCtaTitleTextEntity { + fromIndex: number + ref: PostCtaTitleTextEntityRef + toIndex: number +} + +export interface PostCtaTitleText { + entities: PostCtaTitleTextEntity[] + text: string +} + +export interface PostCta { + action_url: string + background_color: string + show_chevron: boolean + stroke_color: string + title_text: PostCtaTitleText +} + +export interface TweetPostCta { + display_locations: TweetPostCtaDisplayLocationsItem[] + post_cta: PostCta + scribe_id?: string +} + +export interface TweetPreviousCounts { + bookmark_count: number + favorite_count: number + quote_count: number + reply_count: number + retweet_count: number +} + +export interface QuotedRefResult { + result?: TweetUnion +} + +export interface SuperFollowsReplyUserResultCore { + screen_name: string +} + +export interface SuperFollowsReplyUserResultData { + __typename: TypeName + core?: SuperFollowsReplyUserResultCore +} + +export interface SuperFollowsReplyUserResult { + result: SuperFollowsReplyUserResultData +} + +export interface TrendResults { + /** @pattern ^[0-9]+$ */ + rest_id: string +} + +export type UnifiedCardCardFetchState = + (typeof UnifiedCardCardFetchState)[keyof typeof UnifiedCardCardFetchState] + +export const UnifiedCardCardFetchState = { + NoCard: 'NoCard', +} as const + +export interface UnifiedCard { + card_fetch_state: UnifiedCardCardFetchState +} + +export type TweetViewState = + (typeof TweetViewState)[keyof typeof TweetViewState] + +export const TweetViewState = { + Enabled: 'Enabled', + EnabledWithCount: 'EnabledWithCount', +} as const + +export interface TweetView { + /** @pattern ^[0-9]+$ */ + count?: string + state: TweetViewState +} + +export type TweetQuickPromoteEligibility = { [key: string]: unknown } + +export type TweetUnmentionData = { [key: string]: unknown } + +export interface Tweet { + __typename?: TypeName + article?: Article + author_community_relationship?: AuthorCommunityRelationship + birdwatch_pivot?: BirdwatchPivot + card?: TweetCard + community_relationship?: CommunityRelationship + community_results?: CommunityResult + content_disclosure?: ContentDisclosure + core?: UserResultCore + edit_control?: TweetEditControl + edit_prespective?: TweetEditPrespective + grok_analysis_button?: boolean + grok_analysis_followups?: string[] + grok_annotations?: GrokAnnotation + grok_share_attachment?: GrokShareAttachment + grok_translated_post_with_availability?: GrokTranslatedPostWithAvailability + has_birdwatch_notes?: boolean + is_translatable?: boolean + legacy?: TweetLegacy + note_tweet?: NoteTweet + postCta?: TweetPostCta + post_image_description?: string + post_video_description?: string + previous_counts?: TweetPreviousCounts + quick_promote_eligibility?: TweetQuickPromoteEligibility + quotedRefResult?: QuotedRefResult + quoted_status_result?: ItemResult + /** @pattern ^[0-9]+$ */ + rest_id: string + source?: string + superFollowsReplyUserResult?: SuperFollowsReplyUserResult + trend_results?: TrendResults + unified_card?: UnifiedCard + unmention_data?: TweetUnmentionData + views?: TweetView +} + +export type TweetInterstitialTextEntityRefType = + (typeof TweetInterstitialTextEntityRefType)[keyof typeof TweetInterstitialTextEntityRefType] + +export const TweetInterstitialTextEntityRefType = { + TimelineUrl: 'TimelineUrl', +} as const + +export type TweetInterstitialTextEntityRefUrlType = + (typeof TweetInterstitialTextEntityRefUrlType)[keyof typeof TweetInterstitialTextEntityRefUrlType] + +export const TweetInterstitialTextEntityRefUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface TweetInterstitialTextEntityRef { + type: TweetInterstitialTextEntityRefType + url: string + urlType: TweetInterstitialTextEntityRefUrlType +} + +export interface TweetInterstitialTextEntity { + fromIndex: number + ref: TweetInterstitialTextEntityRef + toIndex: number +} + +export interface TweetInterstitialText { + entities: TweetInterstitialTextEntity[] + rtl: boolean + text: string +} + +export interface MediaVisibilityResultsBlurredImageInterstitial { + opacity: number + text: TweetInterstitialText + title: TweetInterstitialText +} + +export interface MediaVisibilityResults { + blurred_image_interstitial: MediaVisibilityResultsBlurredImageInterstitial +} + +export type TweetInterstitialDisplayType = + (typeof TweetInterstitialDisplayType)[keyof typeof TweetInterstitialDisplayType] + +export const TweetInterstitialDisplayType = { + NonCompliant: 'NonCompliant', + EntireTweet: 'EntireTweet', +} as const + +export interface TweetInterstitialRevealText { + entities: TweetInterstitialTextEntity[] + rtl: boolean + text: string +} + +export interface TweetInterstitial { + __typename: TypeName + displayType: TweetInterstitialDisplayType + revealText: TweetInterstitialRevealText + text: TweetInterstitialText +} + +export type TweetWithVisibilityResultsLimitedActionResults = { + [key: string]: unknown +} + +export interface TweetWithVisibilityResults { + __typename: TypeName + limitedActionResults?: TweetWithVisibilityResultsLimitedActionResults + mediaVisibilityResults?: MediaVisibilityResults + tweet: Tweet + tweetInterstitial?: TweetInterstitial +} + +export interface TweetTombstone { + __typename?: TypeName + [key: string]: unknown +} + +export interface TweetUnavailable { + __typename?: TypeName + reason?: string +} + +export type TweetPreviewDisplayCtaUrlUrlType = + (typeof TweetPreviewDisplayCtaUrlUrlType)[keyof typeof TweetPreviewDisplayCtaUrlUrlType] + +export const TweetPreviewDisplayCtaUrlUrlType = { + DeepLink: 'DeepLink', + UrtEndpoint: 'UrtEndpoint', + ExternalUrl: 'ExternalUrl', +} as const + +export interface TweetPreviewDisplayCtaUrl { + url: string + urlType: TweetPreviewDisplayCtaUrlUrlType +} + +export interface TweetPreviewDisplayCta { + title: string + url: TweetPreviewDisplayCtaUrl +} + +export type LimitedActionResultsDataAction = + (typeof LimitedActionResultsDataAction)[keyof typeof LimitedActionResultsDataAction] + +export const LimitedActionResultsDataAction = { + Reply: 'Reply', + Retweet: 'Retweet', + QuoteTweet: 'QuoteTweet', + Like: 'Like', + React: 'React', + AddToBookmarks: 'AddToBookmarks', + AddToMoment: 'AddToMoment', + PinToProfile: 'PinToProfile', + ViewHiddenReplies: 'ViewHiddenReplies', + VoteOnPoll: 'VoteOnPoll', + ShowRetweetActionMenu: 'ShowRetweetActionMenu', + ReplyDownVote: 'ReplyDownVote', + SendViaDm: 'SendViaDm', + ViewPostEngagements: 'ViewPostEngagements', +} as const + +export interface LimitedActionResultsData { + action: LimitedActionResultsDataAction +} + +export interface TweetLimitedActionResults { + limited_actions: LimitedActionResultsData[] +} + +export interface ArticlePreview { + article_id: number + cover_media?: ArticleCoverMedia + preview_text: string + title: string +} + +export interface TweetPreviewDisplayTweetViewCount { + /** @pattern ^[0-9]+$ */ + count: string +} + +export type TweetPreviewDisplayTweetEntities = { [key: string]: unknown } + +export interface TweetPreviewDisplayTweet { + article_preview?: ArticlePreview + bookmark_count: number + core: UserResultCore + created_at: TwitterTimeFormat + entities: TweetPreviewDisplayTweetEntities + favorite_count: number + quote_count: number + reply_count: number + /** @pattern ^[0-9]+$ */ + rest_id: string + retweet_count: number + text: string + view_count: TweetPreviewDisplayTweetViewCount +} + +export interface TweetPreviewDisplay { + __typename: TypeName + cta: TweetPreviewDisplayCta + limited_action_results: TweetLimitedActionResults + tweet: TweetPreviewDisplayTweet +} + +export type TweetUnion = + | Tweet + | TweetWithVisibilityResults + | TweetTombstone + | TweetUnavailable + | TweetPreviewDisplay + +export interface ItemResult { + __typename?: TypeName + result?: TweetUnion +} + +export type TimelineTweetPromotedMetadata = { [key: string]: unknown } + +export interface TimelineTweet { + __typename: TypeName + hasModeratedReplies?: boolean + highlights?: Highlight + itemType: ContentItemType + promotedMetadata?: TimelineTweetPromotedMetadata + socialContext?: SocialContextUnion + tweetDisplayType: TimelineTweetTweetDisplayType + tweet_results: ItemResult +} + +export type CursorType = (typeof CursorType)[keyof typeof CursorType] + +export const CursorType = { + Top: 'Top', + Bottom: 'Bottom', + ShowMore: 'ShowMore', + ShowMoreThreads: 'ShowMoreThreads', + Gap: 'Gap', + ShowMoreThreadsPrompt: 'ShowMoreThreadsPrompt', +} as const + +export interface DisplayTreatment { + actionText: string + labelText?: string +} + +export interface TimelineTimelineCursor { + __typename: TypeName + cursorType: CursorType + displayTreatment?: DisplayTreatment + entryType?: ContentEntryType + itemType?: ContentEntryType + stopOnEmptyResponse?: boolean + value: string +} + +export type TimelineUserUserDisplayType = + (typeof TimelineUserUserDisplayType)[keyof typeof TimelineUserUserDisplayType] + +export const TimelineUserUserDisplayType = { + User: 'User', + UserDetailed: 'UserDetailed', + SubscribableUser: 'SubscribableUser', + UserConcise: 'UserConcise', +} as const + +export interface TimelineUser { + __typename: TypeName + itemType: ContentItemType + socialContext?: SocialContextUnion + userDisplayType: TimelineUserUserDisplayType + user_results: UserResults +} + +export interface TimelinePrompt { + __typename?: TypeName + [key: string]: unknown +} + +export interface TimelineMessagePrompt { + __typename?: TypeName + [key: string]: unknown +} + +export interface TimelineCommunity { + __typename?: TypeName + [key: string]: unknown +} + +export type TimelineTombstoneTombstoneDisplayType = + (typeof TimelineTombstoneTombstoneDisplayType)[keyof typeof TimelineTombstoneTombstoneDisplayType] + +export const TimelineTombstoneTombstoneDisplayType = { + Inline: 'Inline', +} as const + +export type TombstoneRefType = + (typeof TombstoneRefType)[keyof typeof TombstoneRefType] + +export const TombstoneRefType = { + TimelineUrl: 'TimelineUrl', +} as const + +export type TombstoneRefUrlType = + (typeof TombstoneRefUrlType)[keyof typeof TombstoneRefUrlType] + +export const TombstoneRefUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface TombstoneRef { + type?: TombstoneRefType + url?: string + urlType?: TombstoneRefUrlType +} + +export interface TombstoneEntity { + fromIndex?: number + ref?: TombstoneRef + toIndex?: number +} + +export interface TombstoneRichText { + entities?: TombstoneEntity[] + rtl?: boolean + text?: string +} + +export interface TombstoneInfo { + richText?: TombstoneRichText + text?: string +} + +export interface TimelineTombstone { + __typename?: TypeName + itemType?: ContentItemType + tombstoneDisplayType?: TimelineTombstoneTombstoneDisplayType + tombstoneInfo?: TombstoneInfo +} + +export interface TrendImage { + url?: string +} + +export interface ThumbnailImage { + original_img_height?: number + original_img_url?: string + original_img_width?: number +} + +export interface TrendMetadata { + url?: SocialContextLandingUrl +} + +export interface TimelineTrend { + __typename: TypeName + images?: TrendImage[] + is_ai_trend?: boolean + itemType?: ContentItemType + name: string + social_context?: SocialContextUnion + thumbnail_image?: ThumbnailImage + trend_metadata: TrendMetadata + trend_url: SocialContextLandingUrl +} + +export interface RichMessage { + rtl?: boolean + text?: string +} + +export type NotificationTemplateFromUsersItem = { [key: string]: unknown } + +export type NotificationTemplateTargetObjectsItem = { [key: string]: unknown } + +export interface NotificationTemplate { + __typename?: TypeName + from_users?: NotificationTemplateFromUsersItem[] + target_objects?: NotificationTemplateTargetObjectsItem[] +} + +export interface TimelineNotification { + __typename: TypeName + id: string + itemType: ContentItemType + notification_icon: string + notification_url: SocialContextLandingUrl + rich_message: RichMessage + template: NotificationTemplate + timestamp_ms: string +} + +export type ItemContentUnion = + | TimelineTweet + | TimelineTimelineCursor + | TimelineUser + | TimelinePrompt + | TimelineMessagePrompt + | TimelineCommunity + | TimelineTombstone + | TimelineTrend + | TimelineNotification + +export type TimelineTimelineItemFeedbackInfo = { [key: string]: unknown } + +export interface TimelineTimelineItem { + __typename: TypeName + clientEventInfo?: ClientEventInfo + entryType: ContentEntryType + feedbackInfo?: TimelineTimelineItemFeedbackInfo + itemContent: ItemContentUnion +} + +export type DisplayType = (typeof DisplayType)[keyof typeof DisplayType] + +export const DisplayType = { + Vertical: 'Vertical', + VerticalConversation: 'VerticalConversation', + VerticalGrid: 'VerticalGrid', + Carousel: 'Carousel', +} as const + +export interface FeedbackInfo { + clientEventInfo?: ClientEventInfo + feedbackKeys?: string[] +} + +export interface ModuleEntry { + clientEventInfo?: ClientEventInfo + feedbackInfo?: FeedbackInfo + itemContent: ItemContentUnion +} + +export interface ModuleItem { + dispensable?: boolean + /** @pattern ^(([a-zA-Z]+|[0-9]+|[0-9a-f]+)(-|$))+ */ + entryId: string + item: ModuleEntry +} + +export type TimelineTimelineModuleFooter = { [key: string]: unknown } + +export type TimelineTimelineModuleHeader = { [key: string]: unknown } + +export type TimelineTimelineModuleMetadata = { [key: string]: unknown } + +export interface TimelineTimelineModule { + __typename: TypeName + clientEventInfo?: ClientEventInfo + displayType: DisplayType + entryType: ContentEntryType + feedbackInfo?: FeedbackInfo + footer?: TimelineTimelineModuleFooter + header?: TimelineTimelineModuleHeader + items?: ModuleItem[] + metadata?: TimelineTimelineModuleMetadata +} + +export type ContentUnion = + | TimelineTimelineItem + | TimelineTimelineModule + | TimelineTimelineCursor + +export interface TimelineAddEntry { + content: ContentUnion + /** @pattern ^(([a-zA-Z]+|[0-9]+|[0-9a-f]+)(-|$))+ */ + entryId: string + /** @pattern [0-9]+$ */ + sortIndex: string +} + +export type InstructionType = + (typeof InstructionType)[keyof typeof InstructionType] + +export const InstructionType = { + TimelineAddEntries: 'TimelineAddEntries', + TimelineAddToModule: 'TimelineAddToModule', + TimelineClearCache: 'TimelineClearCache', + TimelinePinEntry: 'TimelinePinEntry', + TimelineReplaceEntry: 'TimelineReplaceEntry', + TimelineShowAlert: 'TimelineShowAlert', + TimelineTerminateTimeline: 'TimelineTerminateTimeline', + TimelineShowCover: 'TimelineShowCover', + TimelineClearEntriesUnreadState: 'TimelineClearEntriesUnreadState', + TimelineMarkEntriesUnreadGreaterThanSortIndex: + 'TimelineMarkEntriesUnreadGreaterThanSortIndex', +} as const + +export interface TimelineAddEntries { + entries: TimelineAddEntry[] + type: InstructionType +} + +export interface TimelineAddToModule { + moduleEntryId: string + moduleItems: ModuleItem[] + prepend?: boolean + type: InstructionType +} + +export interface TimelineClearCache { + type: InstructionType +} + +export interface TimelinePinEntry { + entry: TimelineAddEntry + type: InstructionType +} + +export interface TimelineReplaceEntry { + entry: TimelineAddEntry + entry_id_to_replace: string + type: InstructionType +} + +export type TimelineShowAlertAlertType = + (typeof TimelineShowAlertAlertType)[keyof typeof TimelineShowAlertAlertType] + +export const TimelineShowAlertAlertType = { + NewTweets: 'NewTweets', +} as const + +export type TimelineShowAlertDisplayLocation = + (typeof TimelineShowAlertDisplayLocation)[keyof typeof TimelineShowAlertDisplayLocation] + +export const TimelineShowAlertDisplayLocation = { + Top: 'Top', +} as const + +export type TimelineShowAlertColorConfig = { [key: string]: unknown } + +export type TimelineShowAlertIconDisplayInfo = { [key: string]: unknown } + +export type TimelineShowAlertRichTextEntitiesItem = { [key: string]: unknown } + +export type TimelineShowAlertRichText = { + entities?: TimelineShowAlertRichTextEntitiesItem[] + text?: string +} + +export interface TimelineShowAlert { + alertType?: TimelineShowAlertAlertType + clientEventInfo?: ClientEventInfo + colorConfig?: TimelineShowAlertColorConfig + displayDurationMs?: number + displayLocation?: TimelineShowAlertDisplayLocation + iconDisplayInfo?: TimelineShowAlertIconDisplayInfo + richText: TimelineShowAlertRichText + triggerDelayMs?: number + type: InstructionType + usersResults: UserResults[] +} + +export type TimelineTerminateTimelineDirection = + (typeof TimelineTerminateTimelineDirection)[keyof typeof TimelineTerminateTimelineDirection] + +export const TimelineTerminateTimelineDirection = { + Top: 'Top', + Bottom: 'Bottom', + TopAndBottom: 'TopAndBottom', +} as const + +export interface TimelineTerminateTimeline { + direction: TimelineTerminateTimelineDirection + type: InstructionType +} + +export type TimelineHalfCoverHalfCoverDisplayType = + (typeof TimelineHalfCoverHalfCoverDisplayType)[keyof typeof TimelineHalfCoverHalfCoverDisplayType] + +export const TimelineHalfCoverHalfCoverDisplayType = { + Cover: 'Cover', +} as const + +export interface Callback { + endpoint: string +} + +export type CoverCtaButtonStyle = + (typeof CoverCtaButtonStyle)[keyof typeof CoverCtaButtonStyle] + +export const CoverCtaButtonStyle = { + Primary: 'Primary', +} as const + +export type CtaClientEventInfoAction = + (typeof CtaClientEventInfoAction)[keyof typeof CtaClientEventInfoAction] + +export const CtaClientEventInfoAction = { + primary_cta: 'primary_cta', +} as const + +export interface CtaClientEventInfo { + action: CtaClientEventInfoAction +} + +export type TimelineCoverBehaviorType = + (typeof TimelineCoverBehaviorType)[keyof typeof TimelineCoverBehaviorType] + +export const TimelineCoverBehaviorType = { + TimelineCoverBehaviorDismiss: 'TimelineCoverBehaviorDismiss', + TimelineCoverBehaviorNavigate: 'TimelineCoverBehaviorNavigate', +} as const + +export type TimelineCoverBehaviorUrlUrlType = + (typeof TimelineCoverBehaviorUrlUrlType)[keyof typeof TimelineCoverBehaviorUrlUrlType] + +export const TimelineCoverBehaviorUrlUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface TimelineCoverBehaviorUrl { + url: string + url_type: TimelineCoverBehaviorUrlUrlType +} + +export interface TimelineCoverBehavior { + type: TimelineCoverBehaviorType + url?: TimelineCoverBehaviorUrl +} + +export interface CoverCta { + Text?: string + buttonStyle?: CoverCtaButtonStyle + callbacks: Callback[] + clientEventInfo: CtaClientEventInfo + ctaBehavior: TimelineCoverBehavior +} + +export type TextEntityRefType = + (typeof TextEntityRefType)[keyof typeof TextEntityRefType] + +export const TextEntityRefType = { + TimelineUrl: 'TimelineUrl', +} as const + +export type TextEntityRefUrlType = + (typeof TextEntityRefUrlType)[keyof typeof TextEntityRefUrlType] + +export const TextEntityRefUrlType = { + ExternalUrl: 'ExternalUrl', +} as const + +export interface TextEntityRef { + type: TextEntityRefType + url: string + urlType: TextEntityRefUrlType +} + +export interface TextEntity { + fromIndex: number + ref: TextEntityRef + toIndex: number +} + +export interface Text { + entities: TextEntity[] + text: string +} + +export type TimelineHalfCoverType = + (typeof TimelineHalfCoverType)[keyof typeof TimelineHalfCoverType] + +export const TimelineHalfCoverType = { + TimelineHalfCover: 'TimelineHalfCover', +} as const + +export interface TimelineHalfCover { + dismissible: boolean + halfCoverDisplayType: TimelineHalfCoverHalfCoverDisplayType + impressionCallbacks: Callback[] + primaryCoverCta: CoverCta + primaryText: Text + secondaryText: Text + type: TimelineHalfCoverType +} + +export interface TimelineShowCover { + clientEventInfo: ClientEventInfo + cover: TimelineHalfCover + type: InstructionType +} + +export interface TimelineClearEntriesUnreadState { + type: InstructionType +} + +export interface TimelineMarkEntriesUnreadGreaterThanSortIndex { + /** @pattern [0-9]+$ */ + sort_index?: string + type: InstructionType +} + +export type InstructionUnion = + | TimelineAddEntries + | TimelineAddToModule + | TimelineClearCache + | TimelinePinEntry + | TimelineReplaceEntry + | TimelineShowAlert + | TimelineTerminateTimeline + | TimelineShowCover + | TimelineClearEntriesUnreadState + | TimelineMarkEntriesUnreadGreaterThanSortIndex + +export type TimelineMetadata = { [key: string]: unknown } + +export type TimelineResponseObjects = { [key: string]: unknown } + +export interface Timeline { + instructions: InstructionUnion[] + metadata?: TimelineMetadata + responseObjects?: TimelineResponseObjects +} + +export interface TimelineResult { + id?: string + timeline?: Timeline +} + +export interface ListTweetsTimelineList { + tweets_timeline: TimelineResult +} + +export interface ListTweetsTimelineData { + list: ListTweetsTimelineList +} + +export interface Tracing { + /** @pattern ^[0-9a-f]{16}$ */ + trace_id: string +} + +export interface ErrorExtensions { + code: number + kind: string + name: string + retry_after?: number + source: string + tracing: Tracing +} + +export interface Location { + column: number + line: number +} + +export interface ErrorResponse { + code: number + extensions: ErrorExtensions + kind: string + locations: Location[] + message: string + name: string + path: (string | number)[] + retry_after?: number + source: string + tracing: Tracing +} + +export interface ListLatestTweetsTimelineResponse { + data: ListTweetsTimelineData + errors?: ErrorResponse[] +} + +export interface SearchTimeline { + timeline: Timeline +} + +export interface SearchByRawQuery { + search_timeline: SearchTimeline +} + +export interface SearchTimelineData { + search_by_raw_query: SearchByRawQuery +} + +export interface SearchTimelineResponse { + data: SearchTimelineData + errors?: ErrorResponse[] +} + +export interface TweetDetailResponseData { + threaded_conversation_with_injections_v2?: Timeline +} + +export interface TweetDetailResponse { + data: TweetDetailResponseData + errors?: ErrorResponse[] +} + +export interface UserResponseData { + user?: UserResults +} + +export interface UserResponse { + data: UserResponseData + errors?: ErrorResponse[] +} + +export interface UserTweetsResultV1 { + __typename: TypeName + timeline: TimelineResult +} + +export interface UserTweetsUser { + result: UserTweetsResultV1 +} + +export interface UserTweetsData { + user?: UserTweetsUser +} + +export interface UserTweetsResponse { + data: UserTweetsData + errors?: ErrorResponse[] +} + +export type GetListLatestTweetsTimelineParams = { + variables: { + count: number + listId: string + } + features: { + articles_preview_enabled: boolean + c9s_tweet_anatomy_moderator_badge_enabled: boolean + communities_web_enable_tweet_community_results_fetch: boolean + creator_subscriptions_quote_tweet_preview_enabled: boolean + creator_subscriptions_tweet_preview_api_enabled: boolean + freedom_of_speech_not_reach_fetch_enabled: boolean + graphql_is_translatable_rweb_tweet_is_translatable_enabled: boolean + longform_notetweets_consumption_enabled: boolean + longform_notetweets_inline_media_enabled: boolean + longform_notetweets_rich_text_read_enabled: boolean + payments_enabled: boolean + premium_content_api_read_enabled: boolean + profile_label_improvements_pcf_label_in_post_enabled: boolean + responsive_web_edit_tweet_api_enabled: boolean + responsive_web_enhance_cards_enabled: boolean + responsive_web_graphql_skip_user_profile_image_extensions_enabled: boolean + responsive_web_graphql_timeline_navigation_enabled: boolean + responsive_web_grok_analysis_button_from_backend: boolean + responsive_web_grok_analyze_button_fetch_trends_enabled: boolean + responsive_web_grok_analyze_post_followups_enabled: boolean + responsive_web_grok_community_note_auto_translation_is_enabled: boolean + responsive_web_grok_image_annotation_enabled: boolean + responsive_web_grok_imagine_annotation_enabled: boolean + responsive_web_grok_share_attachment_enabled: boolean + responsive_web_grok_show_grok_translated_post: boolean + responsive_web_jetfuel_frame: boolean + responsive_web_profile_redirect_enabled: boolean + responsive_web_twitter_article_tweet_consumption_enabled: boolean + rweb_tipjar_consumption_enabled: boolean + rweb_video_screen_enabled: boolean + standardized_nudges_misinfo: boolean + tweet_awards_web_tipping_enabled: boolean + tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: boolean + verified_phone_label_enabled: boolean + view_counts_everywhere_api_enabled: boolean + } +} + +export type GetSearchTimelineParams = { + variables: { + count: number + product: string + querySource: string + rawQuery: string + } + features: { + articles_preview_enabled: boolean + c9s_tweet_anatomy_moderator_badge_enabled: boolean + communities_web_enable_tweet_community_results_fetch: boolean + content_disclosure_ai_generated_indicator_enabled: boolean + content_disclosure_indicator_enabled: boolean + creator_subscriptions_tweet_preview_api_enabled: boolean + freedom_of_speech_not_reach_fetch_enabled: boolean + graphql_is_translatable_rweb_tweet_is_translatable_enabled: boolean + longform_notetweets_consumption_enabled: boolean + longform_notetweets_inline_media_enabled: boolean + longform_notetweets_rich_text_read_enabled: boolean + post_ctas_fetch_enabled: boolean + premium_content_api_read_enabled: boolean + profile_label_improvements_pcf_label_in_post_enabled: boolean + responsive_web_edit_tweet_api_enabled: boolean + responsive_web_enhance_cards_enabled: boolean + responsive_web_graphql_skip_user_profile_image_extensions_enabled: boolean + responsive_web_graphql_timeline_navigation_enabled: boolean + responsive_web_grok_analysis_button_from_backend: boolean + responsive_web_grok_analyze_button_fetch_trends_enabled: boolean + responsive_web_grok_analyze_post_followups_enabled: boolean + responsive_web_grok_annotations_enabled: boolean + responsive_web_grok_community_note_auto_translation_is_enabled: boolean + responsive_web_grok_image_annotation_enabled: boolean + responsive_web_grok_imagine_annotation_enabled: boolean + responsive_web_grok_share_attachment_enabled: boolean + responsive_web_grok_show_grok_translated_post: boolean + responsive_web_jetfuel_frame: boolean + responsive_web_profile_redirect_enabled: boolean + responsive_web_twitter_article_tweet_consumption_enabled: boolean + rweb_cashtags_composer_attachment_enabled: boolean + rweb_cashtags_enabled: boolean + rweb_conversational_replies_downvote_enabled: boolean + rweb_tipjar_consumption_enabled: boolean + rweb_video_screen_enabled: boolean + standardized_nudges_misinfo: boolean + tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: boolean + verified_phone_label_enabled: boolean + view_counts_everywhere_api_enabled: boolean + } +} + +export type GetTweetDetailParams = { + variables: { + focalTweetId: string + includePromotedContent: boolean + rankingMode: string + referrer: string + withBirdwatchNotes: boolean + withCommunity: boolean + withQuickPromoteEligibilityTweetFields: boolean + withVoice: boolean + with_rux_injections: boolean + } + features: { + articles_preview_enabled: boolean + c9s_tweet_anatomy_moderator_badge_enabled: boolean + communities_web_enable_tweet_community_results_fetch: boolean + content_disclosure_ai_generated_indicator_enabled: boolean + content_disclosure_indicator_enabled: boolean + creator_subscriptions_tweet_preview_api_enabled: boolean + freedom_of_speech_not_reach_fetch_enabled: boolean + graphql_is_translatable_rweb_tweet_is_translatable_enabled: boolean + longform_notetweets_consumption_enabled: boolean + longform_notetweets_inline_media_enabled: boolean + longform_notetweets_rich_text_read_enabled: boolean + post_ctas_fetch_enabled: boolean + premium_content_api_read_enabled: boolean + profile_label_improvements_pcf_label_in_post_enabled: boolean + responsive_web_edit_tweet_api_enabled: boolean + responsive_web_enhance_cards_enabled: boolean + responsive_web_graphql_skip_user_profile_image_extensions_enabled: boolean + responsive_web_graphql_timeline_navigation_enabled: boolean + responsive_web_grok_analysis_button_from_backend: boolean + responsive_web_grok_analyze_button_fetch_trends_enabled: boolean + responsive_web_grok_analyze_post_followups_enabled: boolean + responsive_web_grok_annotations_enabled: boolean + responsive_web_grok_community_note_auto_translation_is_enabled: boolean + responsive_web_grok_image_annotation_enabled: boolean + responsive_web_grok_imagine_annotation_enabled: boolean + responsive_web_grok_share_attachment_enabled: boolean + responsive_web_grok_show_grok_translated_post: boolean + responsive_web_jetfuel_frame: boolean + responsive_web_profile_redirect_enabled: boolean + responsive_web_twitter_article_tweet_consumption_enabled: boolean + rweb_cashtags_composer_attachment_enabled: boolean + rweb_cashtags_enabled: boolean + rweb_conversational_replies_downvote_enabled: boolean + rweb_tipjar_consumption_enabled: boolean + rweb_video_screen_enabled: boolean + standardized_nudges_misinfo: boolean + tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: boolean + verified_phone_label_enabled: boolean + view_counts_everywhere_api_enabled: boolean + } + fieldToggles: { + withArticlePlainText: boolean + withArticleRichContentState: boolean + withArticleSummaryText: boolean + withArticleVoiceOver: boolean + withDisallowedReplyControls: boolean + withGrokAnalyze: boolean + } +} + +export type GetUserByScreenNameParams = { + variables: { + screen_name: string + } + features: { + creator_subscriptions_tweet_preview_api_enabled: boolean + hidden_profile_subscriptions_enabled: boolean + highlights_tweets_tab_ui_enabled: boolean + profile_label_improvements_pcf_label_in_post_enabled: boolean + responsive_web_graphql_skip_user_profile_image_extensions_enabled: boolean + responsive_web_graphql_timeline_navigation_enabled: boolean + responsive_web_profile_redirect_enabled: boolean + responsive_web_twitter_article_notes_tab_enabled: boolean + rweb_tipjar_consumption_enabled: boolean + subscriptions_feature_can_gift_premium: boolean + subscriptions_verification_info_is_identity_verified_enabled: boolean + subscriptions_verification_info_verified_since_enabled: boolean + verified_phone_label_enabled: boolean + } + fieldToggles: { + withAuxiliaryUserLabels: boolean + withPayments: boolean + } +} + +export type GetUserTweetsParams = { + variables: { + count: number + includePromotedContent: boolean + userId: string + withQuickPromoteEligibilityTweetFields: boolean + withVoice: boolean + } + features: { + articles_preview_enabled: boolean + c9s_tweet_anatomy_moderator_badge_enabled: boolean + communities_web_enable_tweet_community_results_fetch: boolean + content_disclosure_ai_generated_indicator_enabled: boolean + content_disclosure_indicator_enabled: boolean + creator_subscriptions_tweet_preview_api_enabled: boolean + freedom_of_speech_not_reach_fetch_enabled: boolean + graphql_is_translatable_rweb_tweet_is_translatable_enabled: boolean + longform_notetweets_consumption_enabled: boolean + longform_notetweets_inline_media_enabled: boolean + longform_notetweets_rich_text_read_enabled: boolean + post_ctas_fetch_enabled: boolean + premium_content_api_read_enabled: boolean + profile_label_improvements_pcf_label_in_post_enabled: boolean + responsive_web_edit_tweet_api_enabled: boolean + responsive_web_enhance_cards_enabled: boolean + responsive_web_graphql_skip_user_profile_image_extensions_enabled: boolean + responsive_web_graphql_timeline_navigation_enabled: boolean + responsive_web_grok_analysis_button_from_backend: boolean + responsive_web_grok_analyze_button_fetch_trends_enabled: boolean + responsive_web_grok_analyze_post_followups_enabled: boolean + responsive_web_grok_annotations_enabled: boolean + responsive_web_grok_community_note_auto_translation_is_enabled: boolean + responsive_web_grok_image_annotation_enabled: boolean + responsive_web_grok_imagine_annotation_enabled: boolean + responsive_web_grok_share_attachment_enabled: boolean + responsive_web_grok_show_grok_translated_post: boolean + responsive_web_jetfuel_frame: boolean + responsive_web_profile_redirect_enabled: boolean + responsive_web_twitter_article_tweet_consumption_enabled: boolean + rweb_cashtags_composer_attachment_enabled: boolean + rweb_cashtags_enabled: boolean + rweb_conversational_replies_downvote_enabled: boolean + rweb_tipjar_consumption_enabled: boolean + rweb_video_screen_enabled: boolean + standardized_nudges_misinfo: boolean + tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: boolean + verified_phone_label_enabled: boolean + view_counts_everywhere_api_enabled: boolean + } + fieldToggles: { + withArticlePlainText: boolean + } +} + +export type getListLatestTweetsTimelineResponse200 = { + data: ListLatestTweetsTimelineResponse + status: 200 +} + +export type getListLatestTweetsTimelineResponseSuccess = + getListLatestTweetsTimelineResponse200 & { + headers: Headers + } + +export type getListLatestTweetsTimelineResponse = + getListLatestTweetsTimelineResponseSuccess + +export const getGetListLatestTweetsTimelineUrl = ( + params: GetListLatestTweetsTimelineParams, + pathQueryId: string = 'FVWmROVvhgjRPC-4jAUh8A', +) => { + const normalizedParams = new URLSearchParams() + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)) + } + }) + + const stringifiedParams = normalizedParams.toString() + + return stringifiedParams.length > 0 + ? `/graphql/${pathQueryId}/ListLatestTweetsTimeline?${stringifiedParams}` + : `/graphql/${pathQueryId}/ListLatestTweetsTimeline` +} + +/** + * get tweet list of timeline + */ +export const getListLatestTweetsTimeline = async ( + params: GetListLatestTweetsTimelineParams, + pathQueryId: string = 'FVWmROVvhgjRPC-4jAUh8A', + options?: RequestInit, +): Promise => { + const res = await fetch( + getGetListLatestTweetsTimelineUrl(params, pathQueryId), + { + ...options, + method: 'GET', + }, + ) + + const body = [204, 205, 304].includes(res.status) ? null : await res.text() + + const data: getListLatestTweetsTimelineResponse['data'] = body + ? JSON.parse(body) + : {} + return { + data, + status: res.status, + headers: res.headers, + } as getListLatestTweetsTimelineResponse +} + +export type getSearchTimelineResponse200 = { + data: SearchTimelineResponse + status: 200 +} + +export type getSearchTimelineResponseSuccess = getSearchTimelineResponse200 & { + headers: Headers +} + +export type getSearchTimelineResponse = getSearchTimelineResponseSuccess + +export const getGetSearchTimelineUrl = ( + params: GetSearchTimelineParams, + pathQueryId: string = 'Yw6L66Pw54NHKuq4Dp7b4Q', +) => { + const normalizedParams = new URLSearchParams() + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)) + } + }) + + const stringifiedParams = normalizedParams.toString() + + return stringifiedParams.length > 0 + ? `/graphql/${pathQueryId}/SearchTimeline?${stringifiedParams}` + : `/graphql/${pathQueryId}/SearchTimeline` +} + +/** + * search tweet list. product:[Top, Latest, People, Photos, Videos] + */ +export const getSearchTimeline = async ( + params: GetSearchTimelineParams, + pathQueryId: string = 'Yw6L66Pw54NHKuq4Dp7b4Q', + options?: RequestInit, +): Promise => { + const res = await fetch(getGetSearchTimelineUrl(params, pathQueryId), { + ...options, + method: 'GET', + }) + + const body = [204, 205, 304].includes(res.status) ? null : await res.text() + + const data: getSearchTimelineResponse['data'] = body ? JSON.parse(body) : {} + return { + data, + status: res.status, + headers: res.headers, + } as getSearchTimelineResponse +} + +export type getTweetDetailResponse200 = { + data: TweetDetailResponse + status: 200 +} + +export type getTweetDetailResponseSuccess = getTweetDetailResponse200 & { + headers: Headers +} + +export type getTweetDetailResponse = getTweetDetailResponseSuccess + +export const getGetTweetDetailUrl = ( + params: GetTweetDetailParams, + pathQueryId: string = 'oCon7R-cgWRFy6EfZjaKfg', +) => { + const normalizedParams = new URLSearchParams() + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)) + } + }) + + const stringifiedParams = normalizedParams.toString() + + return stringifiedParams.length > 0 + ? `/graphql/${pathQueryId}/TweetDetail?${stringifiedParams}` + : `/graphql/${pathQueryId}/TweetDetail` +} + +/** + * get TweetDetail + */ +export const getTweetDetail = async ( + params: GetTweetDetailParams, + pathQueryId: string = 'oCon7R-cgWRFy6EfZjaKfg', + options?: RequestInit, +): Promise => { + const res = await fetch(getGetTweetDetailUrl(params, pathQueryId), { + ...options, + method: 'GET', + }) + + const body = [204, 205, 304].includes(res.status) ? null : await res.text() + + const data: getTweetDetailResponse['data'] = body ? JSON.parse(body) : {} + return { + data, + status: res.status, + headers: res.headers, + } as getTweetDetailResponse +} + +export type getUserByScreenNameResponse200 = { + data: UserResponse + status: 200 +} + +export type getUserByScreenNameResponseSuccess = + getUserByScreenNameResponse200 & { + headers: Headers + } + +export type getUserByScreenNameResponse = getUserByScreenNameResponseSuccess + +export const getGetUserByScreenNameUrl = ( + params: GetUserByScreenNameParams, + pathQueryId: string = 'IGgvgiOx4QZndDHuD3x9TQ', +) => { + const normalizedParams = new URLSearchParams() + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)) + } + }) + + const stringifiedParams = normalizedParams.toString() + + return stringifiedParams.length > 0 + ? `/graphql/${pathQueryId}/UserByScreenName?${stringifiedParams}` + : `/graphql/${pathQueryId}/UserByScreenName` +} + +/** + * get user by screen name + */ +export const getUserByScreenName = async ( + params: GetUserByScreenNameParams, + pathQueryId: string = 'IGgvgiOx4QZndDHuD3x9TQ', + options?: RequestInit, +): Promise => { + const res = await fetch(getGetUserByScreenNameUrl(params, pathQueryId), { + ...options, + method: 'GET', + }) + + const body = [204, 205, 304].includes(res.status) ? null : await res.text() + + const data: getUserByScreenNameResponse['data'] = body ? JSON.parse(body) : {} + return { + data, + status: res.status, + headers: res.headers, + } as getUserByScreenNameResponse +} + +export type getUserTweetsResponse200 = { + data: UserTweetsResponse + status: 200 +} + +export type getUserTweetsResponseSuccess = getUserTweetsResponse200 & { + headers: Headers +} + +export type getUserTweetsResponse = getUserTweetsResponseSuccess + +export const getGetUserTweetsUrl = ( + params: GetUserTweetsParams, + pathQueryId: string = '36rb3Xj3iJ64Q-9wKDjCcQ', +) => { + const normalizedParams = new URLSearchParams() + + Object.entries(params || {}).forEach(([key, value]) => { + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : String(value)) + } + }) + + const stringifiedParams = normalizedParams.toString() + + return stringifiedParams.length > 0 + ? `/graphql/${pathQueryId}/UserTweets?${stringifiedParams}` + : `/graphql/${pathQueryId}/UserTweets` +} + +/** + * get user tweets + */ +export const getUserTweets = async ( + params: GetUserTweetsParams, + pathQueryId: string = '36rb3Xj3iJ64Q-9wKDjCcQ', + options?: RequestInit, +): Promise => { + const res = await fetch(getGetUserTweetsUrl(params, pathQueryId), { + ...options, + method: 'GET', + }) + + const body = [204, 205, 304].includes(res.status) ? null : await res.text() + + const data: getUserTweetsResponse['data'] = body ? JSON.parse(body) : {} + return { + data, + status: res.status, + headers: res.headers, + } as getUserTweetsResponse +} diff --git a/e2e/mock-relay.mjs b/e2e/mock-relay.mjs index e5b6e62..e46c349 100644 --- a/e2e/mock-relay.mjs +++ b/e2e/mock-relay.mjs @@ -1,4 +1,5 @@ import { createServer } from 'node:http' +import { tweetLegacyFixture } from './fixtures/twitter.ts' const portValue = process.env.TWITTER_LITE_MOCK_RELAY_PORT const port = Number(portValue) @@ -30,15 +31,11 @@ const tweetResult = ( { conversationId = id, inReplyTo, replyCount = 1 } = {}, ) => ({ rest_id: id, - legacy: { - full_text: text, - created_at: 'Mon Jul 13 00:00:00 +0000 2026', - reply_count: replyCount, - retweet_count: 2, - favorite_count: 3, - conversation_id_str: conversationId, - ...(inReplyTo ? { in_reply_to_status_id_str: inReplyTo } : {}), - }, + legacy: tweetLegacyFixture(id, text, { + conversationId, + inReplyTo, + replyCount, + }), core: { user_results: { result: { diff --git a/orval.config.ts b/orval.config.ts new file mode 100644 index 0000000..4d868e6 --- /dev/null +++ b/orval.config.ts @@ -0,0 +1,75 @@ +import { defineConfig, defineTransformer } from 'orval' + +const selectedTag = 'twitter-lite-e2e' +const selectedOperationIds = new Set([ + 'getUserByScreenName', + 'getUserTweets', + 'getTweetDetail', + 'getSearchTimeline', + 'getListLatestTweetsTimeline', +]) + +const selectE2eOperations = defineTransformer((document) => { + const foundOperationIds = new Set() + + for (const pathItem of Object.values(document.paths ?? {})) { + if (!pathItem || typeof pathItem !== 'object') continue + + for (const candidate of Object.values(pathItem)) { + if ( + !candidate || + typeof candidate !== 'object' || + Array.isArray(candidate) || + !('operationId' in candidate) + ) { + continue + } + + const operation = candidate as { + operationId?: string + tags?: string[] + } + + if ( + operation.operationId && + selectedOperationIds.has(operation.operationId) + ) { + foundOperationIds.add(operation.operationId) + operation.tags = [...(operation.tags ?? []), selectedTag] + } + } + } + + const missingOperationIds = [...selectedOperationIds].filter( + (operationId) => !foundOperationIds.has(operationId), + ) + if (missingOperationIds.length > 0) { + throw new Error( + `twitter-openapi is missing selected operations: ${missingOperationIds.join(', ')}`, + ) + } + + return document +}) + +export default defineConfig({ + twitterOpenApi: { + input: { + target: + 'https://raw.githubusercontent.com/fa0311/twitter-openapi/590dae5c9f8575abc91d3774946bfe6f23960aba/dist/docs/openapi-3.0.yaml', + filters: { + mode: 'include', + tags: [selectedTag], + }, + override: { + transformer: selectE2eOperations, + }, + }, + output: { + clean: true, + client: 'fetch', + mode: 'single', + target: './e2e/generated/twitter-openapi/client.ts', + }, + }, +}) diff --git a/package.json b/package.json index 14a5252..a2f6180 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,18 @@ "engines": { "node": ">=22.12.0" }, + "knip": { + "ignore": [ + "e2e/generated/**" + ] + }, "imports": { "#/*": "./src/*" }, "scripts": { "dev": "vite dev --host 127.0.0.1 --port 3000", "dev:tailscale": "vite dev --host 0.0.0.0 --port 3000", + "generate:e2e-openapi": "orval --config orval.config.ts --formatter biome --fail-on-warnings", "generate-routes": "node scripts/generate-routes.mjs", "check:routes": "pnpm generate-routes && git diff --exit-code -- src/routeTree.gen.ts", "build": "vite build", @@ -49,6 +55,8 @@ "@vitejs/plugin-react": "6.0.3", "jsdom": "29.1.1", "knip": "6.27.0", + "orval": "8.24.0", + "tsx": "4.23.12", "typescript": "7.0.2", "vite": "8.1.4", "vitest": "4.1.10" diff --git a/playwright.config.ts b/playwright.config.ts index aef387f..9cd8ad2 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -22,7 +22,7 @@ export default defineConfig({ }, webServer: [ { - command: `TWITTER_LITE_MOCK_RELAY_PORT=${relayPort} node e2e/mock-relay.mjs`, + command: `TWITTER_LITE_MOCK_RELAY_PORT=${relayPort} pnpm exec tsx e2e/mock-relay.mjs`, port: relayPort, reuseExistingServer: false, timeout: 120_000, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e808d78..3caa6bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,13 +19,13 @@ importers: version: 1.167.1(@tanstack/query-core@5.101.2)(@tanstack/react-query@5.101.2(react@19.2.7))(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.14)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/react-start': specifier: 1.168.27 - version: 1.168.27(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + version: 1.168.27(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@yuta/bird': specifier: 0.10.1 version: 0.10.1 nitro: specifier: 3.0.260610-beta - version: 3.0.260610-beta(chokidar@5.0.0)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + version: 3.0.260610-beta(chokidar@5.0.0)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) react: specifier: 19.2.7 version: 19.2.7 @@ -65,22 +65,28 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: 6.0.3 - version: 6.0.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + version: 6.0.3(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) jsdom: specifier: 29.1.1 version: 29.1.1 knip: specifier: 6.27.0 version: 6.27.0 + orval: + specifier: 8.24.0 + version: 8.24.0(@faker-js/faker@10.5.0)(prettier@3.9.5)(typescript@7.0.2) + tsx: + specifier: 4.23.12 + version: 4.23.12 typescript: specifier: 7.0.2 version: 7.0.2 vite: specifier: 8.1.4 - version: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + version: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) vitest: specifier: 4.1.10 - version: 4.1.10(@types/node@26.1.1)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) packages: @@ -243,6 +249,11 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true + '@commander-js/extra-typings@15.0.0': + resolution: {integrity: sha512-yeJlba62xqmkgELUsn7356MEnzLLu/fw2x4lofFqGnXh6YysRdEs2BaLeLtg1+KU0AXvMeqQvTTp+3hBEBK+EA==} + peerDependencies: + commander: ~15.0.0 + '@csstools/color-helpers@6.1.0': resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} engines: {node: '>=20.19.0'} @@ -294,6 +305,162 @@ packages: '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@exodus/bytes@1.15.1': resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -303,6 +470,13 @@ packages: '@noble/hashes': optional: true + '@faker-js/faker@10.5.0': + resolution: {integrity: sha512-bsxD8WLS5lIj7aaoCx1YJkktqYj5vlBUE6HWzu2Q51ksrGJ0H737ECCKlFU7Yf8Br45z9t99frBp/J7kzbMPAg==} + engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} + + '@gerrit0/mini-shiki@3.23.0': + resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -341,6 +515,52 @@ packages: resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} engines: {node: '>=20.0'} + '@orval/angular@8.24.0': + resolution: {integrity: sha512-tmDca47QJdB7+suSUdjki3oURBP/EHhHkvgbOmm4KPy2G0YBKHSEm/oMphE5fab4TBzMNEVoiBi5PnK7m6Hu3g==} + + '@orval/axios@8.24.0': + resolution: {integrity: sha512-cldt9cGeZrgNtUb4iLeyE8mLh1PJisfGhdw4jmR+d1ZQl6H2ZjS7mQ+e+KU1SbZ1dITHeuZUC9I9UwHtZ882gw==} + + '@orval/core@8.24.0': + resolution: {integrity: sha512-2aHwQ+3wFNu4rjqMlITSqtsO8YLvvyk+hvBdyLmrKTdyk3De9gQBoMynnLwVU0V6MXgb2a7x7bd1nnRelGJHJA==} + peerDependencies: + '@faker-js/faker': '>=10' + peerDependenciesMeta: + '@faker-js/faker': + optional: true + + '@orval/effect@8.24.0': + resolution: {integrity: sha512-+0pj5Fy6mHpUva9AwIddfgNSQWfZKbt+4AsJVCU6YuhE7GBme0LppTpB6FCYl3GarbwE2PY8ApTQ8Wgt8hvO8Q==} + + '@orval/fetch@8.24.0': + resolution: {integrity: sha512-Wfw4rkeTHhTmGyJYMCc3ar/rczymkskxN1g4+koVmmynhIziwlHJAaNXc4uwnbEhg6S/T0QGrX9OTGSmd+NDSg==} + + '@orval/hono@8.24.0': + resolution: {integrity: sha512-CTEg31oZwj1ZkFVaqg6V8fbc5qz9f72ScYQvk6EOGRbV7Q/hDhYDuWbpscw16epW9KcUlo3N3Zf20haMTLz4yw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + '@orval/mcp@8.24.0': + resolution: {integrity: sha512-nbO2sYmtdMkeBsl74BfpoaYYNrelbH+/0ss9xWXX6sW7IZoJK8NqhiaJ4idEuyQ/fF4g7fTBmsWipZdEUDLYdQ==} + + '@orval/mock@8.24.0': + resolution: {integrity: sha512-XjnZM/0WQdlh/+IGT3P/UjKvYzOm+89avkd5wadC0StBpHgGCnYWuENmoLdkbOBhAeyeL6l9Jp11+mOllU6MZw==} + + '@orval/query@8.24.0': + resolution: {integrity: sha512-E3biV70vHOUKJSn+no6nJAd6Pg40V4PnyHXtR/U7lAaPTAQPM7k9tKpRaGoIijogmmX6h06yOI687HU1N/RSJA==} + + '@orval/solid-start@8.24.0': + resolution: {integrity: sha512-X+T7GaHbe1GgR7ltpiFiw4F6klj2pGyCNqkHxTsc4SA/GwiFemBAyBXSdIhMTPU4JObehiFB4soojmS/WPnzBw==} + + '@orval/swr@8.24.0': + resolution: {integrity: sha512-7YBfqSUGpbZRm6siBm1vYa4qz7ukm+uimDfW6M1tOfCyySfve3SIMPMI0c/Sl7hmWdBZYcSYqRyasG7Nr9qBtg==} + + '@orval/zod@8.24.0': + resolution: {integrity: sha512-TXK+tQbh9y/q2XlneOqmwg3B6BsbjnLJhkG1/1dMnK3EDdqbf5HSmYKndejJmloomgAdugv0OGyOgmBdSaeisg==} + '@oxc-parser/binding-android-arm-eabi@0.137.0': resolution: {integrity: sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -680,6 +900,48 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@scalar/helpers@0.10.0': + resolution: {integrity: sha512-IAfnpIZnXY6ni+zyFMwWHBa5b/7yr4mCSvoTGR84oS9q4Quy2wjgafnr7CyfL65ney3iilBZHigZYLYqdqCu3Q==} + engines: {node: '>=22'} + + '@scalar/json-magic@0.12.20': + resolution: {integrity: sha512-5JawJ1L3+ddDoKefkXsklKs6CmmTIcPDmkJPpAkbRi9QQiU9MUONQ4VSi2z3ij+8Ka4neNhsXBNG4itPjurBLg==} + engines: {node: '>=22'} + + '@scalar/openapi-parser@0.28.12': + resolution: {integrity: sha512-s9XgyuWOJ2hQuojulgVm86upBF6vG8IQ8XSCpZxemm6Z2qVncNw2qsZKZ3+6eJOqCQEgJLmvgHSlXpRKq1si9Q==} + engines: {node: '>=22'} + + '@scalar/openapi-types@0.9.4': + resolution: {integrity: sha512-eUSIjZEBLEF2i2pvcNdzXhzlKx6qt+hZsNklLmCyzPBoXWxHcQaEClgMFavXDRRvJDdi6LkyjqGUqqf0XgRgFg==} + engines: {node: '>=22'} + + '@scalar/openapi-upgrader@0.2.13': + resolution: {integrity: sha512-bPTkDsthDXj/3bgO7RDmRra1OfwxG/uQio6LP0h9Z8NCCgoZQ4E+V7S6bwF/9TWxbMRlb9djRNpbXCTh/L3C5g==} + engines: {node: '>=22'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -879,6 +1141,9 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/node@26.1.1': resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} @@ -890,6 +1155,9 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -1056,6 +1324,30 @@ packages: resolution: {integrity: sha512-WS6rI6P3ilwmTH6V9ANEp4pb1zxhnYAlKW1oDKsTwz7wJrh+toZ/bsAYaxbN/5+2wOdZEyWxSC5J8m8/goinBA==, tarball: https://git.yutakobayashi.com/api/packages/yuta/npm/%40yuta%2Fbird/-/0.10.1/bird-0.10.1.tgz} hasBin: true + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1089,6 +1381,10 @@ packages: babel-dead-code-elimination@1.0.12: resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + baseline-browser-mapping@2.10.43: resolution: {integrity: sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==} engines: {node: '>=6.0.0'} @@ -1097,6 +1393,10 @@ packages: bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + browserslist@4.28.6: resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1117,6 +1417,13 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1127,6 +1434,10 @@ packages: cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crossws@0.4.10: resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} peerDependencies: @@ -1205,6 +1516,10 @@ packages: electron-to-chromium@1.5.389: resolution: {integrity: sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + entities@8.0.0: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} @@ -1230,6 +1545,11 @@ packages: es-module-lexer@2.3.0: resolution: {integrity: sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1237,6 +1557,14 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} @@ -1244,6 +1572,12 @@ packages: exsolve@1.1.0: resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} @@ -1259,11 +1593,23 @@ packages: fetchdts@0.1.7: resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + find-up@8.0.0: + resolution: {integrity: sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==} + engines: {node: '>=20'} + formatly@0.3.0: resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} engines: {node: '>=18.3.0'} hasBin: true + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1278,9 +1624,16 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + h3@2.0.1-rc.20: resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} engines: {node: '>=20.11.1'} @@ -1311,17 +1664,36 @@ packages: httpxy@0.5.5: resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + isbot@5.2.0: resolution: {integrity: sha512-gbZiGCb4B5xaoxg9mS7koAyRdvJnArk10VLSHOgz6rtBG93/pi1xOFaVvXMKZ7JXgyZ8zAbNRK5uIBdIUTFSqw==} engines: {node: '>=18'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -1333,6 +1705,10 @@ packages: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + hasBin: true + jsdom@29.1.1: resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -1347,11 +1723,21 @@ packages: engines: {node: '>=6'} hasBin: true + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -1361,6 +1747,10 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + leven@4.1.0: + resolution: {integrity: sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -1435,6 +1825,13 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + linkify-it@5.0.2: + resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} + + locate-path@8.0.0: + resolution: {integrity: sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==} + engines: {node: '>=20'} + lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} @@ -1442,6 +1839,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -1449,13 +1849,24 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + markdown-it@14.3.0: + resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} + hasBin: true + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdurl@2.1.0: + resolution: {integrity: sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1502,6 +1913,10 @@ packages: resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} engines: {node: '>=18'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + obug@2.1.3: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} @@ -1515,6 +1930,16 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + orval@8.24.0: + resolution: {integrity: sha512-dtrFTGJQCtTpvsFk7BEKzNsvjYW8SD0hFUyoC2dL4bWVHfKmujRWeMYgm3h9U/cJPZBpgG4UqLnfVY8/DbZpYw==} + engines: {node: '>=22.18.0'} + hasBin: true + peerDependencies: + prettier: '>=3.0.0' + peerDependenciesMeta: + prettier: + optional: true + oxc-parser@0.137.0: resolution: {integrity: sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1522,9 +1947,29 @@ packages: oxc-resolver@11.21.3: resolution: {integrity: sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1558,6 +2003,14 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1582,6 +2035,10 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} + remeda@2.39.0: + resolution: {integrity: sha512-3Ki8dU1o3OVu4dwIQ2Pj+yiuP7OnEbmWAGmJ3yDRqopily5jsj8NWzPvbS89H85d6UdONKEcUnrfuHY6jN9vyw==} + engines: {node: '>=18.0.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -1618,9 +2075,21 @@ packages: resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==} engines: {node: '>=10'} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + smol-toml@1.7.0: resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==} engines: {node: '>= 18'} @@ -1644,6 +2113,14 @@ packages: std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1688,11 +2165,38 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.12: + resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + typedoc-plugin-coverage@4.0.3: + resolution: {integrity: sha512-baim3wyMkqpX7rBzL/6iZ7wzKJuSr9ffP16RHOsdTUNoHUZeXLIZHSUBtUhXmNHaUNRgfqdmKLBwyggbJjGdeQ==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc-plugin-markdown@4.12.0: + resolution: {integrity: sha512-eJDEMAfxCmede22c/Jw7d0FA13ggAQv+KkwQYKYCdqI02cin6Rc9QRwbG/7XvvHWinuFejySnZVUWDtvGk3Vbg==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc@0.28.20: + resolution: {integrity: sha512-uSKqkh8Cr48vllnEy+jdaAgOeR6Y+QCBW7usgUsKj7gJEfR7stw9U/fE49LBnj2tPRKPY0c0EBJSWe9Appmplg==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x + typescript@7.0.2: resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} engines: {node: '>=16.20.0'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} @@ -1710,6 +2214,14 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unplugin@3.3.0: resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1943,6 +2455,11 @@ packages: resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -1967,6 +2484,14 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -2146,6 +2671,10 @@ snapshots: dependencies: css-tree: 3.2.1 + '@commander-js/extra-typings@15.0.0(commander@15.0.0)': + dependencies: + commander: 15.0.0 + '@csstools/color-helpers@6.1.0': {} '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': @@ -2197,8 +2726,97 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + '@exodus/bytes@1.15.1': {} + '@faker-js/faker@10.5.0': + optional: true + + '@gerrit0/mini-shiki@3.23.0': + dependencies: + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2249,6 +2867,126 @@ snapshots: '@oozcitak/util@10.0.0': {} + '@orval/angular@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/axios@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/core@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@scalar/openapi-types': 0.9.4 + acorn: 8.18.0 + compare-versions: 6.1.1 + debug: 4.4.3 + esbuild: 0.28.2 + esutils: 2.0.3 + fs-extra: 11.4.0 + jiti: 2.7.0 + jsesc: 3.1.0 + remeda: 2.39.0 + tinyglobby: 0.2.17 + typedoc: 0.28.20(typescript@7.0.2) + optionalDependencies: + '@faker-js/faker': 10.5.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@orval/effect@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + remeda: 2.39.0 + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/fetch@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/hono@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/zod': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + fs-extra: 11.4.0 + optionalDependencies: + typescript: 7.0.2 + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + + '@orval/mcp@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/fetch': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/zod': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/mock@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + remeda: 2.39.0 + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/query@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/fetch': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + remeda: 2.39.0 + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/solid-start@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/swr@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/fetch': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + + '@orval/zod@8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2)': + dependencies: + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + jsesc: 3.1.0 + remeda: 2.39.0 + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + '@oxc-parser/binding-android-arm-eabi@0.137.0': optional: true @@ -2433,6 +3171,57 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@scalar/helpers@0.10.0': {} + + '@scalar/json-magic@0.12.20': + dependencies: + '@scalar/helpers': 0.10.0 + pathe: 2.0.3 + yaml: 2.9.0 + + '@scalar/openapi-parser@0.28.12': + dependencies: + '@scalar/helpers': 0.10.0 + '@scalar/json-magic': 0.12.20 + '@scalar/openapi-types': 0.9.4 + '@scalar/openapi-upgrader': 0.2.13 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv-formats: 3.0.1(ajv@8.20.0) + jsonpointer: 5.0.1 + leven: 4.1.0 + yaml: 2.9.0 + + '@scalar/openapi-types@0.9.4': {} + + '@scalar/openapi-upgrader@0.2.13': + dependencies: + '@scalar/openapi-types': 0.9.4 + + '@sec-ant/readable-stream@0.4.1': {} + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sindresorhus/merge-streams@4.0.0': {} + '@standard-schema/spec@1.1.0': {} '@tanstack/history@1.162.0': {} @@ -2472,14 +3261,14 @@ snapshots: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) - '@tanstack/react-start-rsc@0.1.26(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/react-start-rsc@0.1.26(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/router-core': 1.171.14 '@tanstack/router-utils': 1.162.2 '@tanstack/start-client-core': 1.170.13 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@tanstack/start-server-core': 1.169.16(crossws@0.4.10(srvx@0.11.22)) '@tanstack/start-storage-context': 1.167.16 pathe: 2.0.3 @@ -2509,21 +3298,21 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start@1.168.27(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/react-start@1.168.27(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/react-start-client': 1.168.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@tanstack/react-start-rsc': 0.1.26(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/react-start-rsc': 0.1.26(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@tanstack/react-start-server': 1.167.21(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/router-utils': 1.162.2 '@tanstack/start-client-core': 1.170.13 - '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@tanstack/start-server-core': 1.169.16(crossws@0.4.10(srvx@0.11.22)) pathe: 2.0.3 react: 19.2.7 react-dom: 19.2.7(react@19.2.7) optionalDependencies: - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -2565,7 +3354,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/router-plugin@1.168.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -2574,11 +3363,11 @@ snapshots: '@tanstack/router-generator': 1.167.18 '@tanstack/router-utils': 1.162.2 chokidar: 5.0.0 - unplugin: 3.3.0(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) zod: 4.4.3 optionalDependencies: '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -2616,14 +3405,14 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + '@tanstack/start-plugin-core@1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.7 '@babel/types': 7.29.7 '@tanstack/router-core': 1.171.14 '@tanstack/router-generator': 1.167.18 - '@tanstack/router-plugin': 1.168.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/router-plugin': 1.168.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@tanstack/router-utils': 1.162.2 '@tanstack/start-server-core': 1.169.16(crossws@0.4.10(srvx@0.11.22)) exsolve: 1.1.0 @@ -2635,11 +3424,11 @@ snapshots: srvx: 0.11.22 tinyglobby: 0.2.17 ufo: 1.6.4 - vitefu: 1.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + vitefu: 1.1.3(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) xmlbuilder2: 4.0.3 zod: 4.4.3 optionalDependencies: - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -2720,6 +3509,10 @@ snapshots: '@types/estree@1.0.9': {} + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + '@types/node@26.1.1': dependencies: undici-types: 8.3.0 @@ -2732,6 +3525,8 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/unist@3.0.3': {} + '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -2792,10 +3587,10 @@ snapshots: '@typescript/typescript-win32-x64@7.0.2': optional: true - '@vitejs/plugin-react@6.0.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.3(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) '@vitest/expect@4.1.10': dependencies: @@ -2806,13 +3601,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -2844,6 +3639,23 @@ snapshots: json5: 2.2.3 kleur: 4.1.5 + acorn@8.18.0: {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} ansi-styles@5.2.0: {} @@ -2871,12 +3683,18 @@ snapshots: transitivePeerDependencies: - supports-color + balanced-match@4.0.4: {} + baseline-browser-mapping@2.10.43: {} bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + browserslist@4.28.6: dependencies: baseline-browser-mapping: 2.10.43 @@ -2895,12 +3713,22 @@ snapshots: commander@14.0.3: {} + commander@15.0.0: {} + + compare-versions@6.1.1: {} + consola@3.4.2: {} convert-source-map@2.0.0: {} cookie-es@3.1.1: {} + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crossws@0.4.10(srvx@0.11.22): optionalDependencies: srvx: 0.11.22 @@ -2941,6 +3769,8 @@ snapshots: electron-to-chromium@1.5.389: {} + entities@4.5.0: {} + entities@8.0.0: {} env-runner@0.1.16: @@ -2952,16 +3782,66 @@ snapshots: es-module-lexer@2.3.0: {} + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 + esutils@2.0.3: {} + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.2.0 + expect-type@1.4.0: {} exsolve@1.1.0: {} + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.5: {} + fd-package-json@2.0.0: dependencies: walk-up-path: 4.0.0 @@ -2972,10 +3852,25 @@ snapshots: fetchdts@0.1.7: {} + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + find-up@8.0.0: + dependencies: + locate-path: 8.0.0 + unicorn-magic: 0.3.0 + formatly@0.3.0: dependencies: fd-package-json: 2.0.0 + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + fsevents@2.3.2: optional: true @@ -2984,10 +3879,17 @@ snapshots: gensync@1.0.0-beta.2: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 + graceful-fs@4.2.11: {} + h3@2.0.1-rc.20(crossws@0.4.10(srvx@0.11.22)): dependencies: rou3: 0.8.1 @@ -3012,12 +3914,22 @@ snapshots: httpxy@0.5.5: {} + human-signals@8.0.1: {} + indent-string@4.0.0: {} + is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + isbot@5.2.0: {} + isexe@2.0.0: {} + jiti@2.7.0: {} js-tokens@4.0.0: {} @@ -3026,6 +3938,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.3.1: + dependencies: + argparse: 2.0.1 + jsdom@29.1.1: dependencies: '@asamuzakjp/css-color': 5.1.11 @@ -3054,8 +3970,18 @@ snapshots: jsesc@3.1.0: {} + json-schema-traverse@1.0.0: {} + json5@2.2.3: {} + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpointer@5.0.1: {} + kleur@4.1.5: {} knip@6.27.0: @@ -3074,6 +4000,8 @@ snapshots: yaml: 2.9.0 zod: 4.4.3 + leven@4.1.0: {} + lightningcss-android-arm64@1.32.0: optional: true @@ -3123,29 +4051,54 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + linkify-it@5.0.2: + dependencies: + uc.micro: 2.1.0 + + locate-path@8.0.0: + dependencies: + p-locate: 6.0.0 + lru-cache@11.5.2: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lunr@2.3.9: {} + lz-string@1.5.0: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + markdown-it@14.3.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.2 + mdurl: 2.1.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + mdn-data@2.27.1: {} + mdurl@2.1.0: {} + min-indent@1.0.1: {} + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + ms@2.1.3: {} nanoid@3.3.15: {} nf3@0.3.22: {} - nitro@3.0.260610-beta(chokidar@5.0.0)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): + nitro@3.0.260610-beta(chokidar@5.0.0)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.10(srvx@0.11.22) @@ -3163,7 +4116,7 @@ snapshots: unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3) optionalDependencies: jiti: 2.7.0 - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -3198,6 +4151,11 @@ snapshots: node-releases@2.0.51: {} + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + obug@2.1.3: {} ocache@0.1.5: @@ -3208,6 +4166,44 @@ snapshots: ohash@2.0.11: {} + orval@8.24.0(@faker-js/faker@10.5.0)(prettier@3.9.5)(typescript@7.0.2): + dependencies: + '@commander-js/extra-typings': 15.0.0(commander@15.0.0) + '@orval/angular': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/axios': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/core': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/effect': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/fetch': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/hono': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/mcp': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/mock': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/query': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/solid-start': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/swr': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@orval/zod': 8.24.0(@faker-js/faker@10.5.0)(typescript@7.0.2) + '@scalar/json-magic': 0.12.20 + '@scalar/openapi-parser': 0.28.12 + '@scalar/openapi-types': 0.9.4 + chokidar: 5.0.0 + commander: 15.0.0 + execa: 9.6.1 + find-up: 8.0.0 + fs-extra: 11.4.0 + get-tsconfig: 4.14.0 + jiti: 2.7.0 + js-yaml: 4.3.1 + remeda: 2.39.0 + string-argv: 0.3.2 + typedoc: 0.28.20(typescript@7.0.2) + typedoc-plugin-coverage: 4.0.3(typedoc@0.28.20(typescript@7.0.2)) + typedoc-plugin-markdown: 4.12.0(typedoc@0.28.20(typescript@7.0.2)) + optionalDependencies: + prettier: 3.9.5 + transitivePeerDependencies: + - '@faker-js/faker' + - supports-color + - typescript + oxc-parser@0.137.0: dependencies: '@oxc-project/types': 0.137.0 @@ -3255,10 +4251,24 @@ snapshots: '@oxc-resolver/binding-win32-arm64-msvc': 11.21.3 '@oxc-resolver/binding-win32-x64-msvc': 11.21.3 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + parse-ms@4.0.0: {} + parse5@8.0.1: dependencies: entities: 8.0.0 + path-key@3.1.1: {} + + path-key@4.0.0: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -3287,6 +4297,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + punycode.js@2.3.1: {} + punycode@2.3.1: {} react-dom@19.2.7(react@19.2.7): @@ -3305,6 +4321,8 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 + remeda@2.39.0: {} + require-from-string@2.0.2: {} resolve-pkg-maps@1.0.0: {} @@ -3346,8 +4364,16 @@ snapshots: seroval@1.5.5: {} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + signal-exit@4.1.0: {} + smol-toml@1.7.0: {} source-map-js@1.2.1: {} @@ -3360,6 +4386,10 @@ snapshots: std-env@4.2.0: {} + string-argv@0.3.2: {} + + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -3396,6 +4426,29 @@ snapshots: tslib@2.8.1: optional: true + tsx@4.23.12: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + + typedoc-plugin-coverage@4.0.3(typedoc@0.28.20(typescript@7.0.2)): + dependencies: + typedoc: 0.28.20(typescript@7.0.2) + + typedoc-plugin-markdown@4.12.0(typedoc@0.28.20(typescript@7.0.2)): + dependencies: + typedoc: 0.28.20(typescript@7.0.2) + + typedoc@0.28.20(typescript@7.0.2): + dependencies: + '@gerrit0/mini-shiki': 3.23.0 + lunr: 2.3.9 + markdown-it: 14.3.0 + minimatch: 10.2.6 + typescript: 7.0.2 + yaml: 2.9.0 + typescript@7.0.2: optionalDependencies: '@typescript/typescript-aix-ppc64': 7.0.2 @@ -3419,6 +4472,8 @@ snapshots: '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 + uc.micro@2.1.0: {} + ufo@1.6.4: {} unbash@4.0.3: {} @@ -3431,14 +4486,19 @@ snapshots: dependencies: pathe: 2.0.3 - unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): + unicorn-magic@0.3.0: {} + + universalify@2.0.1: {} + + unplugin@3.3.0(esbuild@0.28.2)(rolldown@1.1.5)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 optionalDependencies: + esbuild: 0.28.2 rolldown: 1.1.5 - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3): optionalDependencies: @@ -3457,7 +4517,7 @@ snapshots: dependencies: react: 19.2.7 - vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0): + vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.5 @@ -3466,18 +4526,20 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.1.1 + esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 + tsx: 4.23.12 yaml: 2.9.0 - vitefu@1.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): optionalDependencies: - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) - vitest@4.1.10(@types/node@26.1.1)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)): + vitest@4.1.10(@types/node@26.1.1)(jsdom@29.1.1)(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -3494,7 +4556,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.4(@types/node@26.1.1)(jiti@2.7.0)(yaml@2.9.0) + vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 @@ -3522,6 +4584,10 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' + which@2.0.2: + dependencies: + isexe: 2.0.0 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -3542,4 +4608,8 @@ snapshots: yaml@2.9.0: {} + yocto-queue@1.2.2: {} + + yoctocolors@2.2.0: {} + zod@4.4.3: {}