From d0985ccf92e21f155d0f99c70fba6eccd21795e0 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 1 Aug 2026 16:11:35 -0400 Subject: [PATCH 01/17] feat(openapi): document error responses and undocumented schema fields --- openapi/components/parameters.yaml | 16 +- openapi/components/paths.yaml | 8 +- openapi/components/paths/authentication.yaml | 32 + openapi/components/paths/avatars.yaml | 18 +- openapi/components/paths/calendar.yaml | 6 + openapi/components/paths/economy.yaml | 105 +- openapi/components/paths/favorites.yaml | 3 + openapi/components/paths/groups.yaml | 2350 +++++++++-------- openapi/components/paths/instances.yaml | 8 + openapi/components/paths/invite.yaml | 4 + openapi/components/paths/jams.yaml | 216 +- openapi/components/paths/miscellaneous.yaml | 4 + openapi/components/paths/notifications.yaml | 2 +- openapi/components/paths/props.yaml | 34 +- openapi/components/paths/users.yaml | 45 +- openapi/components/paths/worlds.yaml | 24 +- .../CreateGroupAnnouncementRequest.yaml | 2 +- .../requests/CreateInstanceRequest.yaml | 1 - .../requests/UpdateWorldRequest.yaml | 14 + .../responses/RequestValidationError.yaml | 14 + .../responses/RouteNotImplementedError.yaml | 10 + .../OAuthRedirectCodeResponse.yaml | 5 + .../SsoProviderUnsupportedError.yaml | 11 + .../authentication/SsoTokenResponse.yaml | 5 + .../responses/economy/AccountStateError.yaml | 18 + .../ProductListingsForbiddenError.yaml | 11 + .../economy/StoresUnavailableError.yaml | 11 + .../responses/groups/GroupPostsResponse.yaml | 2 + .../instances/InstanceBadRequestError.yaml | 11 + .../HideNotificationSuccess.yaml | 11 + .../system/InfoPushBadRequestError.yaml | 11 + .../users/PersistenceOwnershipError.yaml | 12 + .../users/UpdateOtherUserForbiddenError.yaml | 11 + .../responses/users/UserNotFoundError.yaml | 11 + .../responses/users/UserResponse.yaml | 16 +- openapi/components/schemas/APIConfig.yaml | 66 +- .../schemas/APIConfigAudioConfig.yaml | 4 + .../schemas/APIConfigEventShelfCampaign.yaml | 16 + .../components/schemas/APIConfigEvents.yaml | 2 + .../APIConfigLoadingScreenWeights.yaml | 12 + .../schemas/APIConfigProfileDefaults.yaml | 19 + openapi/components/schemas/Avatar.yaml | 7 +- openapi/components/schemas/BareError.yaml | 12 + openapi/components/schemas/CalendarEvent.yaml | 3 + .../schemas/CalendarEventDiscovery.yaml | 1 - openapi/components/schemas/CurrentUser.yaml | 48 +- .../schemas/CurrentUserPresence.yaml | 10 + .../components/schemas/DynamicContentRow.yaml | 98 +- .../components/schemas/EconomyBalances.yaml | 1 - .../components/schemas/FavoritedWorld.yaml | 3 + .../schemas/FileAnalysisAvatarStats.yaml | 2 + .../schemas/FriendRequestStatus.yaml | 4 + openapi/components/schemas/Group.yaml | 198 +- .../components/schemas/GroupAnnouncement.yaml | 10 + .../components/schemas/GroupPermission.yaml | 5 + openapi/components/schemas/GroupPost.yaml | 2 +- openapi/components/schemas/GroupRole.yaml | 6 + .../schemas/GroupRoleTemplateRole.yaml | 19 + .../schemas/GroupRoleTemplateValues.yaml | 16 +- openapi/components/schemas/InfoPush.yaml | 13 + openapi/components/schemas/InfoPushData.yaml | 89 +- .../schemas/InfoPushDataArticle.yaml | 23 +- .../schemas/InfoPushDataArticleContent.yaml | 7 + .../schemas/InfoPushDataCategory.yaml | 22 + .../schemas/InfoPushDataClickable.yaml | 6 + .../schemas/InfoPushDataSearch.yaml | 13 + .../schemas/InfoPushEmbeddedLink.yaml | 13 + .../schemas/InfoPushExperiment.yaml | 7 + .../components/schemas/InfoPushIpsQuery.yaml | 7 + openapi/components/schemas/Instance.yaml | 12 + openapi/components/schemas/InventoryDrop.yaml | 6 +- openapi/components/schemas/InventoryItem.yaml | 6 + .../components/schemas/InventoryMetadata.yaml | 3 + .../components/schemas/InventoryTemplate.yaml | 4 +- openapi/components/schemas/Jam.yaml | 5 + openapi/components/schemas/JamSubmission.yaml | 2 + openapi/components/schemas/LimitedGroup.yaml | 2 + .../components/schemas/LimitedUserFriend.yaml | 14 + .../components/schemas/LimitedUserGroups.yaml | 2 + openapi/components/schemas/LimitedWorld.yaml | 3 + .../components/schemas/LocalizedString.yaml | 15 + openapi/components/schemas/MutualFriend.yaml | 15 + .../schemas/NotificationDetailEmpty.yaml | 4 + .../components/schemas/NotificationV2.yaml | 7 +- .../schemas/NotificationV2DataEmpty.yaml | 5 + .../components/schemas/OAuthRedirectCode.yaml | 10 + .../components/schemas/PrivateProfile.yaml | 3 + .../components/schemas/ProductListing.yaml | 21 +- .../schemas/ProductListingAttribution.yaml | 8 + .../ProductListingAttributionCreator.yaml | 8 + openapi/components/schemas/PublicProfile.yaml | 3 +- .../components/schemas/ReportCategory.yaml | 42 +- openapi/components/schemas/ReportReason.yaml | 28 +- .../components/schemas/RepresentedGroup.yaml | 2 + .../schemas/RouteNotImplemented.yaml | 16 + openapi/components/schemas/SsoProvider.yaml | 9 + openapi/components/schemas/SsoToken.yaml | 9 + openapi/components/schemas/StoreShelf.yaml | 6 + openapi/components/schemas/Subscription.yaml | 9 + openapi/components/schemas/Transaction.yaml | 9 +- openapi/components/schemas/User.yaml | 18 +- openapi/components/schemas/World.yaml | 14 +- openapi/components/tags.yaml | 5 + 103 files changed, 2663 insertions(+), 1488 deletions(-) create mode 100644 openapi/components/responses/RequestValidationError.yaml create mode 100644 openapi/components/responses/RouteNotImplementedError.yaml create mode 100644 openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml create mode 100644 openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml create mode 100644 openapi/components/responses/authentication/SsoTokenResponse.yaml create mode 100644 openapi/components/responses/economy/AccountStateError.yaml create mode 100644 openapi/components/responses/economy/ProductListingsForbiddenError.yaml create mode 100644 openapi/components/responses/economy/StoresUnavailableError.yaml create mode 100644 openapi/components/responses/instances/InstanceBadRequestError.yaml create mode 100644 openapi/components/responses/notifications/HideNotificationSuccess.yaml create mode 100644 openapi/components/responses/system/InfoPushBadRequestError.yaml create mode 100644 openapi/components/responses/users/PersistenceOwnershipError.yaml create mode 100644 openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml create mode 100644 openapi/components/responses/users/UserNotFoundError.yaml create mode 100644 openapi/components/schemas/APIConfigEventShelfCampaign.yaml create mode 100644 openapi/components/schemas/APIConfigLoadingScreenWeights.yaml create mode 100644 openapi/components/schemas/APIConfigProfileDefaults.yaml create mode 100644 openapi/components/schemas/BareError.yaml create mode 100644 openapi/components/schemas/FriendRequestStatus.yaml create mode 100644 openapi/components/schemas/GroupRoleTemplateRole.yaml create mode 100644 openapi/components/schemas/InfoPushDataCategory.yaml create mode 100644 openapi/components/schemas/InfoPushDataSearch.yaml create mode 100644 openapi/components/schemas/InfoPushEmbeddedLink.yaml create mode 100644 openapi/components/schemas/InfoPushExperiment.yaml create mode 100644 openapi/components/schemas/InfoPushIpsQuery.yaml create mode 100644 openapi/components/schemas/LocalizedString.yaml create mode 100644 openapi/components/schemas/OAuthRedirectCode.yaml create mode 100644 openapi/components/schemas/ProductListingAttribution.yaml create mode 100644 openapi/components/schemas/ProductListingAttributionCreator.yaml create mode 100644 openapi/components/schemas/RouteNotImplemented.yaml create mode 100644 openapi/components/schemas/SsoProvider.yaml create mode 100644 openapi/components/schemas/SsoToken.yaml diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index d079c6ad..f352132c 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -254,6 +254,20 @@ favoriteGroupName: in: path schema: $ref: ./schemas/FavoriteName.yaml +ssoProvider: + name: provider + description: The third-party service to mint a token for. + required: true + in: path + schema: + $ref: ./schemas/SsoProvider.yaml +favoriteGroupTypeQuery: + name: type + description: Filter the returned groups to a single favourite type. + required: false + in: query + schema: + $ref: ./schemas/FavoriteType.yaml favoriteGroupType: name: favoriteGroupType description: "The type of group to fetch, must be a valid FavoriteType." @@ -783,7 +797,7 @@ search: type: string sellerId: name: sellerId - description: Seller to retrieve economy metrics for. + description: Seller to scope the results to. required: true in: query schema: diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index 5bcb2a87..a3bd8372 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -296,6 +296,10 @@ $ref: "./paths/economy.yaml#/paths/~1listing~1{productId}" /logout: $ref: "./paths/authentication.yaml#/paths/~1logout" +/oauth/redirectCode: + $ref: "./paths/authentication.yaml#/paths/~1oauth~1redirectCode" +"/sso/{provider}": + $ref: "./paths/authentication.yaml#/paths/~1sso~1{provider}" "/message/{userId}/{messageType}": $ref: "./paths/invite.yaml#/paths/~1message~1{userId}~1{messageType}" "/message/{userId}/{messageType}/{slot}": @@ -464,7 +468,7 @@ $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1platform~1{publishedPlatform}" "/worlds/{worldId}/publish": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1publish" -"/worlds/{worldId}/removeTags": - $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1removeTags" +"/worlds/{worldId}/deleteTags": + $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1deleteTags" "/worlds/{worldId}/{instanceId}": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1{instanceId}" diff --git a/openapi/components/paths/authentication.yaml b/openapi/components/paths/authentication.yaml index 302e8c39..d36cf408 100644 --- a/openapi/components/paths/authentication.yaml +++ b/openapi/components/paths/authentication.yaml @@ -420,6 +420,38 @@ paths: $ref: ../responses/authentication/DeleteUserResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + /oauth/redirectCode: + get: + operationId: getOAuthRedirectCode + summary: Get OAuth Redirect Code + description: Mints a short-lived code that hands the current session to an OAuth redirect. + tags: + - authentication + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/authentication/OAuthRedirectCodeResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/sso/{provider}": + parameters: + - $ref: ../parameters.yaml#/ssoProvider + get: + operationId: getSsoToken + summary: Get SSO Token + description: Returns a token for the given third-party service. + tags: + - authentication + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/authentication/SsoTokenResponse.yaml + "400": + $ref: ../responses/authentication/SsoProviderUnsupportedError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/avatars.yaml b/openapi/components/paths/avatars.yaml index 24ade939..86401c66 100644 --- a/openapi/components/paths/avatars.yaml +++ b/openapi/components/paths/avatars.yaml @@ -18,7 +18,9 @@ paths: get: operationId: searchAvatars summary: Search Avatars - description: Search and list avatars by query filters. You can only search your own or featured avatars. It is not possible as a normal user to search other peoples avatars. + description: Search and list avatars by query filters. You can only search your + own or featured avatars. It is not possible as a normal user to search + other peoples avatars. tags: - avatars parameters: @@ -53,7 +55,9 @@ paths: post: operationId: createAvatar summary: Create Avatar - description: Create an avatar. It's possible to optionally specify a ID if you want a custom one. Attempting to create an Avatar with an already claimed ID will result in a DB error. + description: Create an avatar. It's possible to optionally specify a ID if you + want a custom one. Attempting to create an Avatar with an already + claimed ID will result in a DB error. tags: - avatars requestBody: @@ -165,6 +169,8 @@ paths: responses: "200": $ref: ../responses/avatars/AvatarResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": @@ -172,7 +178,9 @@ paths: delete: operationId: deleteAvatar summary: Delete Avatar - description: 'Delete an avatar. Notice an avatar is never fully "deleted", only its ReleaseStatus is set to "hidden" and the linked Files are deleted. The AvatarID is permanently reserved.' + description: 'Delete an avatar. Notice an avatar is never fully "deleted", only + its ReleaseStatus is set to "hidden" and the linked Files are deleted. + The AvatarID is permanently reserved.' tags: - avatars security: @@ -243,7 +251,6 @@ paths: - $ref: ../parameters.yaml#/avatarId put: operationId: selectFallbackAvatar - deprecated: true summary: Select Fallback Avatar description: Switches into that avatar as your fallback avatar. tags: @@ -265,7 +272,8 @@ paths: get: operationId: getOwnAvatar summary: Get Own Avatar - description: Get the current avatar for the user. This will return an error for any other user than the one logged in. + description: Get the current avatar for the user. This will return an error for + any other user than the one logged in. tags: - avatars security: diff --git a/openapi/components/paths/calendar.yaml b/openapi/components/paths/calendar.yaml index 1b61ef8f..6ee97c79 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -45,7 +45,10 @@ paths: - $ref: ../parameters.yaml#/calendarDiscoveryUpcomingOffsetMinutes - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/calendarDiscoveryNextCursor + # Answers an anonymous caller with real results, so the session is + # optional rather than required. security: + - {} - authCookie: [] responses: "200": @@ -63,7 +66,10 @@ paths: - $ref: ../parameters.yaml#/monthDate - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset + # Answers an anonymous caller, so the session is optional rather than + # required. security: + - {} - authCookie: [] responses: "200": diff --git a/openapi/components/paths/economy.yaml b/openapi/components/paths/economy.yaml index c91760ee..e07472a4 100644 --- a/openapi/components/paths/economy.yaml +++ b/openapi/components/paths/economy.yaml @@ -26,7 +26,9 @@ paths: operationId: getAdminTransaction deprecated: true summary: Get Admin Transactions - description: "Get a single Admin transactions by ID. This returns the exact same information as `getAdminTransactions`, so no point in using this endpoint." + description: "Get a single Admin transactions by ID. This returns the exact same + information as `getAdminTransactions`, so no point in using this + endpoint." tags: - economy security: @@ -56,9 +58,10 @@ paths: - $ref: ../parameters.yaml#/transactionId get: operationId: getSteamTransaction - deprecated: true summary: Get Steam Transaction - description: "Get a single Steam transactions by ID. This returns the exact same information as `getSteamTransactions`, so no point in using this endpoint." + description: "Get a single Steam transactions by ID. This returns the exact same + information as `getSteamTransactions`, so no point in using this + endpoint." tags: - economy security: @@ -121,12 +124,13 @@ paths: parameters: - $ref: ../parameters.yaml#/metricDateStart - $ref: ../parameters.yaml#/metricDateEnd - - $ref: ../parameters.yaml#/sellerId + - $ref: ../parameters.yaml#/sellerIdQuery - $ref: ../parameters.yaml#/groupByDuration get: operationId: getEarningsMetrics summary: Get Earnings Metrics - description: Gets earnings totals and breakdown metrics for the currently authenticated user. + description: Gets earnings totals and breakdown metrics for the currently + authenticated user. tags: - economy security: @@ -212,10 +216,15 @@ paths: /economy/seller/eligibility: get: operationId: getSellerEligibility + deprecated: true summary: Get Seller Eligibility - description: Get the eligibility of the currently authenticated user to become a seller + description: |- + ~~Get the eligibility of the currently authenticated user to become a seller~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -223,6 +232,8 @@ paths: $ref: ../responses/economy/SellerEligibilityResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml /economy/store: parameters: - $ref: ../parameters.yaml#/storeId @@ -261,14 +272,15 @@ paths: $ref: ../responses/MissingCredentialsError.yaml /economy/stores: parameters: - - $ref: ../parameters.yaml#/sellerIdQuery + - $ref: ../parameters.yaml#/sellerId - $ref: ../parameters.yaml#/managementPov - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset get: operationId: listStores summary: List Stores - description: Lists stores, optionally filtered to a seller and adjusted for management views. + description: Lists stores, optionally filtered to a seller and adjusted for + management views. tags: - economy security: @@ -278,6 +290,8 @@ paths: $ref: ../responses/economy/StoreListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/economy/StoresUnavailableError.yaml "/licenseGroups/{licenseGroupId}": parameters: - $ref: ../parameters.yaml#/licenseGroupId @@ -298,7 +312,8 @@ paths: post: operationId: createProductListingDirect summary: Create Product Listing - description: Creates a listing and returns the new ProductListing object. The request body is based on observed fields and may be incomplete. + description: Creates a listing and returns the new ProductListing object. The + request body is based on observed fields and may be incomplete. tags: - economy requestBody: @@ -334,7 +349,8 @@ paths: put: operationId: updateProductListingDirect summary: Update Product Listing - description: Updates the active state of a listing. Setting `active` to `true` publishes the listing, while `false` unpublishes it. + description: Updates the active state of a listing. Setting `active` to `true` + publishes the listing, while `false` unpublishes it. tags: - economy requestBody: @@ -436,9 +452,23 @@ paths: get: operationId: getSubscriptions summary: List Subscriptions - description: 'List all existing Subscriptions. For example, "vrchatplus-monthly" and "vrchatplus-yearly".' + description: 'List all existing Subscriptions. For example, "vrchatplus-monthly" + and "vrchatplus-yearly".' tags: - economy + parameters: + - name: gifts + description: Return the giftable subscriptions instead of the standard ones. + required: false + in: query + schema: + type: boolean + - name: recurring + description: Return the recurring subscriptions instead of the standard ones. + required: false + in: query + schema: + type: boolean security: - authCookie: [] responses: @@ -449,10 +479,15 @@ paths: /tilia/status: get: operationId: getTiliaStatus + deprecated: true summary: Get Tilia Status - description: Gets the status of Tilia integration + description: |- + ~~Gets the status of Tilia integration~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -460,6 +495,8 @@ paths: $ref: ../responses/economy/TiliaStatusResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml /tokenBundles: get: operationId: getTokenBundles @@ -510,7 +547,7 @@ paths: get: operationId: getBalance summary: Get Balance - description: Gets the balance of a user + description: Gets the balance of a user. tags: - economy security: @@ -525,10 +562,15 @@ paths: - $ref: ../parameters.yaml#/userId get: operationId: getBalanceEarnings + deprecated: true summary: Get Balance Earnings - description: Gets the balance of a user from earnings + description: |- + ~~Gets the balance of a user from earnings~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -536,6 +578,8 @@ paths: $ref: ../responses/economy/BalanceResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml "/user/{userId}/economy/account": parameters: - $ref: ../parameters.yaml#/userId @@ -598,6 +642,8 @@ paths: responses: "200": $ref: ../responses/economy/EconomyPayoutStatusResponse.yaml + "400": + $ref: ../responses/economy/AccountStateError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "/user/{userId}/economy/transactions": @@ -645,6 +691,8 @@ paths: $ref: ../responses/economy/ProductListingListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/economy/ProductListingsForbiddenError.yaml "/user/{userId}/products": parameters: - $ref: ../parameters.yaml#/userId @@ -677,6 +725,8 @@ paths: responses: "200": $ref: ../responses/economy/TiliaKycResponse.yaml + "400": + $ref: ../responses/economy/AccountStateError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "/user/{userId}/tilia/tos": @@ -684,10 +734,15 @@ paths: - $ref: ../parameters.yaml#/userId get: operationId: getTiliaTos + deprecated: true summary: Get Tilia TOS Agreement Status - description: Gets the status of the agreement of a user to the Tilia TOS + description: |- + ~~Gets the status of the agreement of a user to the Tilia TOS~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -695,12 +750,19 @@ paths: $ref: ../responses/economy/TiliaTOSResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml put: operationId: updateTiliaTos + deprecated: true summary: Update Tilia TOS Agreement Status - description: Updates the status of the agreement of a user to the Tilia TOS + description: |- + ~~Updates the status of the agreement of a user to the Tilia TOS~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated requestBody: content: application/json: @@ -713,16 +775,23 @@ paths: $ref: ../responses/economy/UpdateTiliaTOSResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml "/users/{userId}/credits/eligible": parameters: - $ref: ../parameters.yaml#/userId - $ref: ../parameters.yaml#/subscriptionId get: operationId: getUserCreditsEligible + deprecated: true summary: Get User Credits Eligibility - description: Get the user's eligibility status for subscriptions based on available credits. + description: |- + ~~Get the user's eligibility status for subscriptions based on available credits.~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -730,6 +799,8 @@ paths: $ref: ../responses/economy/UserCreditsEligibleResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml "/users/{userId}/subscription/eligible": parameters: - $ref: ../parameters.yaml#/userId diff --git a/openapi/components/paths/favorites.yaml b/openapi/components/paths/favorites.yaml index 6bc27fac..70a02b43 100644 --- a/openapi/components/paths/favorites.yaml +++ b/openapi/components/paths/favorites.yaml @@ -73,6 +73,7 @@ paths: parameters: - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/favoriteGroupTypeQuery - $ref: ../parameters.yaml#/userIdAdmin - name: ownerId description: The owner whose favorite groups to return. Must be a UserID. @@ -162,6 +163,8 @@ paths: responses: "200": $ref: ../responses/favorites/FavoriteRemovedSuccess.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": diff --git a/openapi/components/paths/groups.yaml b/openapi/components/paths/groups.yaml index 9571e686..a3b600d0 100644 --- a/openapi/components/paths/groups.yaml +++ b/openapi/components/paths/groups.yaml @@ -1,1151 +1,1199 @@ -openapi: 3.0.3 -info: - title: groups - description: Group Docs Here - version: "1.0" -paths: - /files/order: - put: - operationId: setGroupGalleryFileOrder - summary: Set Group Gallery File Order - description: Set the order of the files in a group gallery - tags: - - files - requestBody: - content: - application/json: - schema: - $ref: ../requests/GroupGalleryFileOrderRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryFileOrderResponse.yaml - "404": - $ref: ../responses/files/FileNotFoundError.yaml - /groups: - get: - operationId: searchGroups - summary: Search Group - description: Searches Groups by name or shortCode - tags: - - groups - parameters: - - name: query - description: Query to search for, can be either Group Name or Group shortCode - required: false - in: query - schema: - type: string - - $ref: ../parameters.yaml#/offset - - $ref: ../parameters.yaml#/number - responses: - "200": - $ref: ../responses/groups/LimitedGroupListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - post: - operationId: createGroup - summary: Create Group - description: Creates a Group and returns a Group object. **Requires VRC+ Subscription.** - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - /groups/roleTemplates: - get: - operationId: getGroupRoleTemplates - summary: Get Group Role Templates - description: Obtain predefined templates for group roles - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleTemplatesResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "/groups/{groupId}": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroup - summary: Get Group by ID - description: Returns a single Group by ID. - tags: - - groups - parameters: - - name: includeRoles - description: Include roles for the Group object. Defaults to false. - required: false - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: updateGroup - summary: Update Group - description: Updates a Group and returns it. - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: deleteGroup - summary: Delete Group - description: Deletes a Group. - tags: - - groups - parameters: - - name: hardDelete - required: false - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/announcement": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupAnnouncements - summary: Get Group Announcement - description: |- - Returns the announcement for a Group. - If no announcement has been made, then it returns **empty object**. - If an announcement exists, then it will always return all fields except `imageId` and `imageUrl` which may be null. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAnnouncementResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: createGroupAnnouncement - summary: Create Group Announcement - description: "Creates an Announcement for a Group. Warning: This will also remove all announcements. To make proper announcements, use the posts endpoint instead" - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupAnnouncementRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAnnouncementResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: deleteGroupAnnouncement - summary: Delete Group Announcement - description: Deletes the announcement for a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupAnnouncementSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/auditLogTypes": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupAuditLogEntryTypes - summary: Get Group Audit Log Entry Types - description: Returns a list of audit log entry types for which the group has entries. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAuditLogEntryTypeListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/auditLogs": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupAuditLogs - summary: Get Group Audit Logs - description: Returns a list of audit logs for a Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - $ref: ../parameters.yaml#/startDate - - $ref: ../parameters.yaml#/endDate - - $ref: ../parameters.yaml#/actorIds - - $ref: ../parameters.yaml#/eventTypes - - $ref: ../parameters.yaml#/targetIds - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAuditLogListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/bans": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupBans - summary: Get Group Bans - description: Returns a list of banned users for a Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/NoPermission.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: banGroupMember - summary: Ban Group Member - description: Bans a user from a Group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/BanGroupMemberRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "400": - $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/bans/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - delete: - operationId: unbanGroupMember - summary: Unban Group Member - description: Unbans a user from a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/block": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: blockGroup - summary: Block Group - description: Blocks a Group for the current user. To unblock a group, call kickGroupMember (DELETE /groups/{groupId}/members/{userId}). - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/BlockGroupSuccess.yaml - "400": - $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupAlreadyBlockedError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: createGroupGallery - summary: Create Group Gallery - description: Creates a gallery for a Group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupGalleryRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries/{groupGalleryId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupGalleryId - get: - operationId: getGroupGalleryImages - summary: Get Group Gallery Images - description: Returns a list of images for a Group gallery. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: approved - description: If specified, only returns images that have been approved or not approved. - required: false - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryImageListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: updateGroupGallery - summary: Update Group Gallery - description: Updates a gallery for a Group. - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupGalleryRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: deleteGroupGallery - summary: Delete Group Gallery - description: Deletes a gallery for a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupGallerySuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries/{groupGalleryId}/images": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupGalleryId - post: - operationId: addGroupGalleryImage - summary: Add Group Gallery Image - description: Adds an image to a Group gallery. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/AddGroupGalleryImageRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryImageResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries/{groupGalleryId}/images/{groupGalleryImageId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupGalleryId - - $ref: ../parameters.yaml#/groupGalleryImageId - # put: - # summary: Approve Group Gallery Image - # description: Approves an image for a Group gallery. - # operationId: approveGroupGalleryImage - # tags: - # - groups - # requestBody: - # content: - # application/json: - # schema: - # $ref: ../requests/UpdateGroupGalleryImageRequest.yaml - # responses: - # '200': - # $ref: ../responses/groups/GroupGalleryImageResponse.yaml - # '401': - # $ref: ../responses/MissingCredentialsError.yaml - # '404': - # $ref: ../responses/groups/GroupNotFoundError.yaml - # security: - # - authCookie: [] - delete: - operationId: deleteGroupGalleryImage - summary: Delete Group Gallery Image - description: Deletes an image from a Group gallery. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupGalleryImageSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupGalleryImageDeleteForbiddenError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/instances": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupInstances - summary: Get Group Instances - description: Returns a list of group instances - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupInstanceListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/invites": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupInvites - summary: Get Group Invites Sent - description: Returns a list of members that have been invited to the Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: declineGroupInvite - summary: Decline Invite from Group - description: Declines an invite to the user from a group. - tags: - - groups - requestBody: - required: false - content: - application/json: - schema: - $ref: ../requests/DeclineGroupInviteRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeclineGroupInviteSuccess.yaml - "400": - $ref: ../responses/groups/DeclineGroupInviteBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: createGroupInvite - summary: Invite User to Group - description: Sends an invite to a user to join the group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupInviteRequest.yaml - security: - - authCookie: [] - responses: - "200": - description: OK - "400": - $ref: ../responses/groups/GroupInviteBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupInviteForbiddenError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/invites/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - delete: - operationId: deleteGroupInvite - summary: Delete User Invite - description: Deletes an Group invite sent to a User - tags: - - groups - security: - - authCookie: [] - responses: - "200": - description: OK - "400": - $ref: ../responses/groups/DeleteGroupInviteBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "/groups/{groupId}/join": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: joinGroup - summary: Join Group - description: Join a Group by ID and returns the member object. - tags: - - groups - parameters: - - name: confirmOverrideBlock - description: Manually override the failure that would occur if the user has blocked the group. - required: false - in: query - schema: - type: boolean - requestBody: - required: false - content: - application/json: - schema: - $ref: ../requests/JoinGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "400": - $ref: ../responses/groups/GroupAlreadyMemberError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/leave": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: leaveGroup - summary: Leave Group - description: Leave a group by ID. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - description: OK - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupMembers - summary: List Group Members - description: |- - Returns a List of all **other** Group Members. This endpoint will never return the user calling the endpoint. - Information about the user calling the endpoint must be found in the `myMember` field of the Group object. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - $ref: ../parameters.yaml#/groupMemberSort - - $ref: ../parameters.yaml#/groupMemberRoleFilter - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "400": - $ref: ../responses/users/UsersInvalidSearchError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members/search": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: searchGroupMembers - summary: Search Group Members - description: Search for members in the group by displayName. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: query - description: Filter for member displayName. - required: true - in: query - schema: - type: string - minLength: 3 - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberSearchResponse.yaml - "400": - $ref: ../responses/users/UsersInvalidSearchError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - get: - operationId: getGroupMember - summary: Get Group Member - description: Returns a GroupMember. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: updateGroupMember - summary: Update Group Member - description: Updates a Group Member - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupMemberRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: kickGroupMember - summary: Kick Group Member - description: Kicks a Group Member from the Group. The current user must have the "Remove Group Members" permission. Also used for unblocking groups. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupMemberSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members/{userId}/roles/{groupRoleId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - - $ref: ../parameters.yaml#/groupRoleId - put: - operationId: addGroupMemberRole - summary: Add Role to GroupMember - description: Adds a Role to a Group Member - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleIDListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: removeGroupMemberRole - summary: Remove Role from GroupMember - description: Removes a Role from a Group Member - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleIDListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/permissions": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupPermissions - summary: List Group Permissions - description: Returns a List of all possible/available permissions for a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPermissionListResponse.yaml - "400": - $ref: ../responses/users/UsersInvalidSearchError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/posts": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupPosts - summary: Get posts from a Group - description: Get posts from a Group - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: publicOnly - description: See public posts only. - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostsResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - post: - operationId: addGroupPost - summary: Create a post in a Group - description: Create a post in a Group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupPostRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "/groups/{groupId}/posts/{notificationId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/notificationId - put: - operationId: updateGroupPost - summary: Edits a Group post - description: Edits a Group post - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupPostRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupPostResponseSuccess.yaml - delete: - operationId: deleteGroupPost - summary: Delete a Group post - description: Delete a Group post - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostResponseSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupPostResponseSuccess.yaml - "/groups/{groupId}/representation": - parameters: - - $ref: ../parameters.yaml#/groupId - put: - operationId: updateGroupRepresentation - summary: Update Group Representation - description: |- - Updates whether the user is representing the group. - - When `isRepresenting` is set to `true`, this flag will be set to `false` for all other groups - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - isRepresenting: - type: boolean - description: Whether the user is representing the group. - required: - - isRepresenting - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/UpdateGroupRepresentationSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "/groups/{groupId}/requests": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupRequests - summary: Get Group Join Requests - description: Returns a list of members that have requested to join the Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: blocked - description: See blocked join requests - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "400": - $ref: ../responses/groups/GroupJoinRequestResponseBadRequestError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: cancelGroupRequest - summary: Cancel Group Join Request - description: Cancels a request sent to join the group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - description: OK - "400": - description: You can't cancel a join request if you didn't request to join․ - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/requests/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - put: - operationId: respondGroupJoinRequest - summary: Respond Group Join request - description: Responds to a Group Join Request with Accept/Deny - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/RespondGroupJoinRequest.yaml - security: - - authCookie: [] - responses: - "200": - description: OK - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/roles": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupRoles - summary: Get Group Roles - description: Returns a Group Role by ID. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: createGroupRole - summary: Create GroupRole - description: Create a Group role. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupRoleRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/roles/{groupRoleId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupRoleId - put: - operationId: updateGroupRole - summary: Update Group Role - description: Updates a group role by ID. - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupRoleRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - delete: - operationId: deleteGroupRole - summary: Delete Group Role - description: Deletes a Group Role by ID and returns the remaining roles. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotMemberError.yaml - "/groups/{groupId}/transfer": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupTransferability - summary: Get Group Transferability - description: Returns the transferability of the group to a given user. - tags: - - groups - parameters: - - name: transferTargetId - description: The UserID of the prospective transferee. - required: false - in: query - schema: - $ref: ../schemas/UserID.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupTransferableResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: initiateOrAcceptGroupTransfer - summary: Initiate or Accept Group Transfer - description: To initiate, must be logged in as the current owner and specify the transferTargetId in the body. To accept, must be logged in as the user targeted by a pending transfer, no body is required. - tags: - - groups - requestBody: - required: false - content: - application/json: - schema: - $ref: ../requests/TransferGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupTransferSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupTransferInvalidError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: cancelGroupTransfer - summary: Cancel Group Transfer - description: Cancel a Group Transfer. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupTransferCanceledSuccess.yaml - "400": - $ref: ../responses/groups/NoGroupTransferError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml -components: - responses: {} - securitySchemes: - $ref: ../securitySchemes.yaml -tags: - $ref: ../tags.yaml +openapi: 3.0.3 +info: + title: groups + description: Group Docs Here + version: "1.0" +paths: + /files/order: + put: + operationId: setGroupGalleryFileOrder + summary: Set Group Gallery File Order + description: Set the order of the files in a group gallery + tags: + - files + requestBody: + content: + application/json: + schema: + $ref: ../requests/GroupGalleryFileOrderRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryFileOrderResponse.yaml + "404": + $ref: ../responses/files/FileNotFoundError.yaml + /groups: + get: + operationId: searchGroups + summary: Search Group + description: Searches Groups by name or shortCode + tags: + - groups + parameters: + - name: query + description: Query to search for, can be either Group Name or Group shortCode + required: false + in: query + schema: + type: string + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/number + responses: + "200": + $ref: ../responses/groups/LimitedGroupListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + post: + operationId: createGroup + summary: Create Group + description: Creates a Group and returns a Group object. **Requires VRC+ Subscription.** + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + /groups/roleTemplates: + get: + operationId: getGroupRoleTemplates + summary: Get Group Role Templates + description: Obtain predefined templates for group roles + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleTemplatesResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/groups/{groupId}": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroup + summary: Get Group by ID + description: Returns a single Group by ID. + tags: + - groups + parameters: + - name: includeRoles + description: Include roles for the Group object. Defaults to false. + required: false + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: updateGroup + summary: Update Group + description: Updates a Group and returns it. + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: deleteGroup + summary: Delete Group + description: Deletes a Group. + tags: + - groups + parameters: + - name: hardDelete + required: false + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/announcement": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupAnnouncements + summary: Get Group Announcement + description: |- + Returns the announcement for a Group. + If no announcement has been made, then it returns **empty object**. + If an announcement exists, then it will always return all fields except `imageId` and `imageUrl` which may be null. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAnnouncementResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: createGroupAnnouncement + summary: Create Group Announcement + description: "Creates an Announcement for a Group. Warning: This will also remove all announcements. To make proper announcements, use the posts endpoint instead" + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupAnnouncementRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAnnouncementResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: deleteGroupAnnouncement + summary: Delete Group Announcement + description: Deletes the announcement for a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupAnnouncementSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/auditLogTypes": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupAuditLogEntryTypes + summary: Get Group Audit Log Entry Types + description: Returns a list of audit log entry types for which the group has entries. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAuditLogEntryTypeListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/auditLogs": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupAuditLogs + summary: Get Group Audit Logs + description: Returns a list of audit logs for a Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/startDate + - $ref: ../parameters.yaml#/endDate + - $ref: ../parameters.yaml#/actorIds + - $ref: ../parameters.yaml#/eventTypes + - $ref: ../parameters.yaml#/targetIds + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAuditLogListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/bans": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupBans + summary: Get Group Bans + description: Returns a list of banned users for a Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: banGroupMember + summary: Ban Group Member + description: Bans a user from a Group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/BanGroupMemberRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "400": + $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/bans/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + delete: + operationId: unbanGroupMember + summary: Unban Group Member + description: Unbans a user from a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/block": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: blockGroup + summary: Block Group + description: Blocks a Group for the current user. To unblock a group, call kickGroupMember (DELETE /groups/{groupId}/members/{userId}). + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/BlockGroupSuccess.yaml + "400": + $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupAlreadyBlockedError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: createGroupGallery + summary: Create Group Gallery + description: Creates a gallery for a Group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupGalleryRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries/{groupGalleryId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupGalleryId + get: + operationId: getGroupGalleryImages + summary: Get Group Gallery Images + description: Returns a list of images for a Group gallery. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: approved + description: If specified, only returns images that have been approved or not approved. + required: false + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryImageListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: updateGroupGallery + summary: Update Group Gallery + description: Updates a gallery for a Group. + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupGalleryRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: deleteGroupGallery + summary: Delete Group Gallery + description: Deletes a gallery for a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupGallerySuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries/{groupGalleryId}/images": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupGalleryId + post: + operationId: addGroupGalleryImage + summary: Add Group Gallery Image + description: Adds an image to a Group gallery. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/AddGroupGalleryImageRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryImageResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries/{groupGalleryId}/images/{groupGalleryImageId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupGalleryId + - $ref: ../parameters.yaml#/groupGalleryImageId + # put: + # summary: Approve Group Gallery Image + # description: Approves an image for a Group gallery. + # operationId: approveGroupGalleryImage + # tags: + # - groups + # requestBody: + # content: + # application/json: + # schema: + # $ref: ../requests/UpdateGroupGalleryImageRequest.yaml + # responses: + # '200': + # $ref: ../responses/groups/GroupGalleryImageResponse.yaml + # '401': + # $ref: ../responses/MissingCredentialsError.yaml + # '404': + # $ref: ../responses/groups/GroupNotFoundError.yaml + # security: + # - authCookie: [] + delete: + operationId: deleteGroupGalleryImage + summary: Delete Group Gallery Image + description: Deletes an image from a Group gallery. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupGalleryImageSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupGalleryImageDeleteForbiddenError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/instances": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupInstances + summary: Get Group Instances + description: Returns a list of group instances + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupInstanceListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/invites": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupInvites + summary: Get Group Invites Sent + description: Returns a list of members that have been invited to the Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: declineGroupInvite + summary: Decline Invite from Group + description: Declines an invite to the user from a group. + tags: + - groups + requestBody: + required: false + content: + application/json: + schema: + $ref: ../requests/DeclineGroupInviteRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeclineGroupInviteSuccess.yaml + "400": + $ref: ../responses/groups/DeclineGroupInviteBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: createGroupInvite + summary: Invite User to Group + description: Sends an invite to a user to join the group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupInviteRequest.yaml + security: + - authCookie: [] + responses: + "200": + description: OK + "400": + $ref: ../responses/groups/GroupInviteBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupInviteForbiddenError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/invites/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + delete: + operationId: deleteGroupInvite + summary: Delete User Invite + description: Deletes an Group invite sent to a User + tags: + - groups + security: + - authCookie: [] + responses: + "200": + description: OK + "400": + $ref: ../responses/groups/DeleteGroupInviteBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/groups/{groupId}/join": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: joinGroup + summary: Join Group + description: Join a Group by ID and returns the member object. + tags: + - groups + parameters: + - name: confirmOverrideBlock + description: Manually override the failure that would occur if the user has blocked the group. + required: false + in: query + schema: + type: boolean + requestBody: + required: false + content: + application/json: + schema: + $ref: ../requests/JoinGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "400": + $ref: ../responses/groups/GroupAlreadyMemberError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/leave": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: leaveGroup + summary: Leave Group + description: Leave a group by ID. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + description: OK + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupMembers + summary: List Group Members + description: |- + Returns a List of all **other** Group Members. This endpoint will never return the user calling the endpoint. + Information about the user calling the endpoint must be found in the `myMember` field of the Group object. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/groupMemberSort + - $ref: ../parameters.yaml#/groupMemberRoleFilter + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "400": + $ref: ../responses/users/UsersInvalidSearchError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members/search": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: searchGroupMembers + summary: Search Group Members + description: Search for members in the group by displayName. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: query + description: Filter for member displayName. + required: true + in: query + schema: + type: string + minLength: 3 + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberSearchResponse.yaml + "400": + $ref: ../responses/users/UsersInvalidSearchError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + get: + operationId: getGroupMember + summary: Get Group Member + description: Returns a GroupMember. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: updateGroupMember + summary: Update Group Member + description: Updates a Group Member + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupMemberRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: kickGroupMember + summary: Kick Group Member + description: Kicks a Group Member from the Group. The current user must have the "Remove Group Members" permission. Also used for unblocking groups. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupMemberSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members/{userId}/roles/{groupRoleId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + - $ref: ../parameters.yaml#/groupRoleId + put: + operationId: addGroupMemberRole + summary: Add Role to GroupMember + description: Adds a Role to a Group Member + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleIDListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: removeGroupMemberRole + summary: Remove Role from GroupMember + description: Removes a Role from a Group Member + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleIDListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/permissions": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupPermissions + summary: List Group Permissions + description: Returns a List of all possible/available permissions for a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPermissionListResponse.yaml + "400": + $ref: ../responses/users/UsersInvalidSearchError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/posts": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupPosts + summary: Get posts from a Group + description: Get posts from a Group + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: publicOnly + description: See public posts only. + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostsResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + post: + operationId: addGroupPost + summary: Create a post in a Group + description: Create a post in a Group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupPostRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/groups/{groupId}/posts/{notificationId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/notificationId + put: + operationId: updateGroupPost + summary: Edits a Group post + description: Edits a Group post + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupPostRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupPostResponseSuccess.yaml + delete: + operationId: deleteGroupPost + summary: Delete a Group post + description: Delete a Group post + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostResponseSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupPostResponseSuccess.yaml + "/groups/{groupId}/representation": + parameters: + - $ref: ../parameters.yaml#/groupId + put: + operationId: updateGroupRepresentation + summary: Update Group Representation + description: |- + Updates whether the user is representing the group. + + When `isRepresenting` is set to `true`, this flag will be set to `false` for all other groups + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + isRepresenting: + type: boolean + description: Whether the user is representing the group. + required: + - isRepresenting + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/UpdateGroupRepresentationSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "/groups/{groupId}/requests": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupRequests + summary: Get Group Join Requests + description: Returns a list of members that have requested to join the Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: blocked + description: See blocked join requests + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "400": + $ref: ../responses/groups/GroupJoinRequestResponseBadRequestError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: cancelGroupRequest + summary: Cancel Group Join Request + description: Cancels a request sent to join the group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + description: OK + "400": + description: You can't cancel a join request if you didn't request to join․ + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/requests/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + put: + operationId: respondGroupJoinRequest + summary: Respond Group Join request + description: Responds to a Group Join Request with Accept/Deny + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/RespondGroupJoinRequest.yaml + security: + - authCookie: [] + responses: + "200": + description: OK + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/roles": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupRoles + summary: Get Group Roles + description: Returns a Group Role by ID. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: createGroupRole + summary: Create GroupRole + description: Create a Group role. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupRoleRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/roles/{groupRoleId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupRoleId + put: + operationId: updateGroupRole + summary: Update Group Role + description: Updates a group role by ID. + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupRoleRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + delete: + operationId: deleteGroupRole + summary: Delete Group Role + description: Deletes a Group Role by ID and returns the remaining roles. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotMemberError.yaml + "/groups/{groupId}/transfer": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupTransferability + summary: Get Group Transferability + description: Returns the transferability of the group to a given user. + tags: + - groups + parameters: + - name: transferTargetId + description: The UserID of the prospective transferee. + required: false + in: query + schema: + $ref: ../schemas/UserID.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupTransferableResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: initiateOrAcceptGroupTransfer + summary: Initiate or Accept Group Transfer + description: To initiate, must be logged in as the current owner and specify the transferTargetId in the body. To accept, must be logged in as the user targeted by a pending transfer, no body is required. + tags: + - groups + requestBody: + required: false + content: + application/json: + schema: + $ref: ../requests/TransferGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupTransferSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupTransferInvalidError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: cancelGroupTransfer + summary: Cancel Group Transfer + description: Cancel a Group Transfer. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupTransferCanceledSuccess.yaml + "400": + $ref: ../responses/groups/NoGroupTransferError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml +components: + responses: {} + securitySchemes: + $ref: ../securitySchemes.yaml +tags: + $ref: ../tags.yaml diff --git a/openapi/components/paths/instances.yaml b/openapi/components/paths/instances.yaml index 073fd0b4..b670245f 100644 --- a/openapi/components/paths/instances.yaml +++ b/openapi/components/paths/instances.yaml @@ -22,6 +22,8 @@ paths: responses: "200": $ref: ../responses/instances/InstanceResponse.yaml + "400": + $ref: ../responses/instances/InstanceBadRequestError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml /instances/recent: @@ -78,7 +80,10 @@ paths: If an invalid instanceId is provided, this endpoint will simply return "null"! tags: - instances + # Answers an anonymous caller, so the session is optional rather than + # required. security: + - {} - authCookie: [] responses: "200": @@ -130,7 +135,10 @@ paths: description: Returns an instance short name. tags: - instances + # Answers an anonymous caller, so the session is optional rather than + # required. security: + - {} - authCookie: [] responses: "200": diff --git a/openapi/components/paths/invite.yaml b/openapi/components/paths/invite.yaml index 141d2e44..c6800b97 100644 --- a/openapi/components/paths/invite.yaml +++ b/openapi/components/paths/invite.yaml @@ -196,6 +196,8 @@ paths: $ref: ../responses/invite/InviteMessageGetNegativeSlotError.yaml "401": $ref: ../responses/NotAuthorizedActionError.yaml + "403": + $ref: ../responses/NotAuthorizedActionError.yaml "404": $ref: ../responses/invite/InviteMessageGetTooHighSlotError.yaml put: @@ -262,6 +264,8 @@ paths: $ref: ../responses/invite/InviteMessageInvalidSlotNumberError.yaml "401": $ref: ../responses/NotAuthorizedActionError.yaml + "403": + $ref: ../responses/NotAuthorizedActionError.yaml "404": $ref: ../responses/invite/InviteMessageNoEntryForSlotError.yaml "429": diff --git a/openapi/components/paths/jams.yaml b/openapi/components/paths/jams.yaml index 4b5c35ed..06885576 100644 --- a/openapi/components/paths/jams.yaml +++ b/openapi/components/paths/jams.yaml @@ -1,107 +1,109 @@ -openapi: 3.0.3 -info: - title: jams - description: Jams Docs Here - version: "1.0" -paths: - /jams: - get: - operationId: getJams - summary: Show jams list - description: |- - Lists World Jams or Avatar Jams, both currently running and ones that have ended. - - `isActive` is used to select only active or already ended jams. - - `type` is used to select only world or avatar jams, and can only take `world` or `avatar`. - `` - tags: - - jams - parameters: - - name: type - description: Only show jams of this type (`avatar` or `world`). - in: query - schema: - type: string - example: avatar - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamListResponse.yaml - "/jams/{jamId}": - parameters: - - $ref: ../parameters.yaml#/jamId - get: - operationId: getJam - summary: Show jam information - description: Returns a jam. - tags: - - jams - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamResponse.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml - "/jams/{jamId}/submissions": - parameters: - - $ref: ../parameters.yaml#/jamId - get: - operationId: getJamSubmissions - summary: Show jam submissions - description: Returns all submissions of a jam. Can filter by contentId (for world or avatar jams) or submitterId (for a participant). - tags: - - jams - parameters: - - $ref: ../parameters.yaml#/contentId - - $ref: ../parameters.yaml#/submitterId - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamSubmissionListResponse.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml - post: - operationId: submitJamContent - summary: Submit Jam Content - description: Submits content to a jam. The content must have been uploaded by the submitter, and both the content upload and jam submission must be made within the jam's designated times. - tags: - - jams - requestBody: - content: - application/json: - schema: - $ref: ../requests/CreateJamSubmissionRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamSubmissionResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml - "/jams/{jamId}/submissions/{jamSubmissionId}": - parameters: - - $ref: ../parameters.yaml#/jamId - - $ref: ../parameters.yaml#/jamSubmissionId - delete: - operationId: deleteJamSubmission - summary: Delete Jam Submission - description: Withdraws a content submission from a jam. - tags: - - jams - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/DeleteJamSubmissionResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/NoPermission.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml +openapi: 3.0.3 +info: + title: jams + description: Jams Docs Here + version: "1.0" +paths: + /jams: + get: + operationId: getJams + summary: Show jams list + description: |- + Lists World Jams or Avatar Jams, both currently running and ones that have ended. + + `isActive` is used to select only active or already ended jams. + + `type` is used to select only world or avatar jams, and can only take `world` or `avatar`. + `` + tags: + - jams + parameters: + - name: type + description: Only show jams of this type (`avatar` or `world`). + in: query + schema: + type: string + example: avatar + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamListResponse.yaml + "/jams/{jamId}": + parameters: + - $ref: ../parameters.yaml#/jamId + get: + operationId: getJam + summary: Show jam information + description: Returns a jam. + tags: + - jams + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamResponse.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml + "/jams/{jamId}/submissions": + parameters: + - $ref: ../parameters.yaml#/jamId + get: + operationId: getJamSubmissions + summary: Show jam submissions + description: Returns all submissions of a jam. Can filter by contentId (for world or avatar jams) or submitterId (for a participant). + tags: + - jams + parameters: + - $ref: ../parameters.yaml#/contentId + - $ref: ../parameters.yaml#/submitterId + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamSubmissionListResponse.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml + post: + operationId: submitJamContent + summary: Submit Jam Content + description: Submits content to a jam. The content must have been uploaded by the submitter, and both the content upload and jam submission must be made within the jam's designated times. + tags: + - jams + requestBody: + content: + application/json: + schema: + $ref: ../requests/CreateJamSubmissionRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamSubmissionResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml + "/jams/{jamId}/submissions/{jamSubmissionId}": + parameters: + - $ref: ../parameters.yaml#/jamId + - $ref: ../parameters.yaml#/jamSubmissionId + delete: + operationId: deleteJamSubmission + summary: Delete Jam Submission + description: Withdraws a content submission from a jam. + tags: + - jams + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/DeleteJamSubmissionResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml diff --git a/openapi/components/paths/miscellaneous.yaml b/openapi/components/paths/miscellaneous.yaml index 82cd5201..547f524f 100644 --- a/openapi/components/paths/miscellaneous.yaml +++ b/openapi/components/paths/miscellaneous.yaml @@ -67,6 +67,8 @@ paths: responses: "200": $ref: ../responses/system/APIHealthResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml /infoPush: get: operationId: getInfoPush @@ -87,6 +89,8 @@ paths: responses: "200": $ref: ../responses/system/InfoPushListResponse.yaml + "400": + $ref: ../responses/system/InfoPushBadRequestError.yaml x-badges: - color: gold label: "Status: Early Access (Still Under Development)" diff --git a/openapi/components/paths/notifications.yaml b/openapi/components/paths/notifications.yaml index 34f19085..7b911ff9 100644 --- a/openapi/components/paths/notifications.yaml +++ b/openapi/components/paths/notifications.yaml @@ -108,7 +108,7 @@ paths: - authCookie: [] responses: "200": - $ref: ../responses/notifications/NotificationResponse.yaml + $ref: ../responses/notifications/HideNotificationSuccess.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "/auth/user/notifications/{notificationId}/see": diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index 1da8071b..acdda025 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -66,7 +66,10 @@ paths: put: operationId: updateProp summary: Update Prop - description: Updates a Prop and returns the updated Prop object. When updating the asset bundle, all of `name`, `assetUrl`, `platform`, `unityVersion`, `assetVersion`, `spawnType`, and `worldPlacementMask` must be present, as well as `propSignature` if this value is not blank. + description: Updates a Prop and returns the updated Prop object. When updating + the asset bundle, all of `name`, `assetUrl`, `platform`, `unityVersion`, + `assetVersion`, `spawnType`, and `worldPlacementMask` must be present, + as well as `propSignature` if this value is not blank. tags: - props requestBody: @@ -80,6 +83,8 @@ paths: responses: "200": $ref: ../responses/props/PropResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "403": @@ -108,10 +113,15 @@ paths: - $ref: ../parameters.yaml#/propId get: operationId: getPropPublishStatus + deprecated: true summary: Get Prop Publish Status - description: Returns a PropPublishStatus object. + description: |- + ~~Returns a PropPublishStatus object.~~ + + **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - props + - deprecated security: - authCookie: [] responses: @@ -122,13 +132,18 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/RouteNotImplementedError.yaml put: operationId: publishProp + deprecated: true summary: Publish Prop - description: Publish a Prop and return the updated PropPublishStatus object. + description: |- + ~~Publish a Prop and return the updated PropPublishStatus object.~~ + + **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - props + - deprecated security: - authCookie: [] responses: @@ -139,13 +154,18 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/RouteNotImplementedError.yaml delete: operationId: unpublishProp + deprecated: true summary: Unpublish Prop - description: Unpublish a Prop and return the updated PropPublishStatus object. + description: |- + ~~Unpublish a Prop and return the updated PropPublishStatus object.~~ + + **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - props + - deprecated security: - authCookie: [] responses: @@ -156,7 +176,7 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/RouteNotImplementedError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index a1961383..646a4339 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -97,13 +97,15 @@ paths: - users parameters: - name: search - description: Searches by `displayName`. Will return empty array if search query is empty or missing. + description: Searches by `displayName`. Will return empty array if search query + is empty or missing. in: query schema: type: string minLength: 0 - name: developerType - description: "Active user by developer type, none for normal users and internal for moderators" + description: "Active user by developer type, none for normal users and internal + for moderators" in: query schema: type: string @@ -125,9 +127,11 @@ paths: x-internal: true deprecated: true summary: Search Active Users - description: "**REQUIRES ADMIN CREDENTIALS**. Search and list any Active users by text query." + description: "**REQUIRES ADMIN CREDENTIALS**. Search and list any Active users + by text query." tags: - users + - deprecated parameters: - name: search description: Username to search for @@ -136,7 +140,8 @@ paths: schema: type: string - name: developerType - description: "Active user by developer type, none for normal users and internal for moderators" + description: "Active user by developer type, none for normal users and internal + for moderators" in: query schema: type: string @@ -157,6 +162,8 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/InvalidAdminCredentialsError.yaml + "404": + $ref: ../responses/users/UserNotFoundError.yaml "/users/{userId}": parameters: - $ref: ../parameters.yaml#/userId @@ -173,6 +180,8 @@ paths: $ref: ../responses/users/UserResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/users/UserNotFoundError.yaml put: operationId: updateUser summary: Update User Info @@ -193,6 +202,8 @@ paths: $ref: ../responses/users/CurrentPasswordRequiredError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/users/UpdateOtherUserForbiddenError.yaml "/users/{userId}/addTags": parameters: - $ref: ../parameters.yaml#/userId @@ -217,6 +228,8 @@ paths: $ref: ../responses/users/UserTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml "/users/{userId}/badges/{badgeId}": parameters: - $ref: ../parameters.yaml#/userId @@ -252,7 +265,6 @@ paths: - $ref: ../parameters.yaml#/offset get: operationId: getUserFeedback - deprecated: true summary: Get User Feedback description: Get user's submitted feedback tags: @@ -307,7 +319,8 @@ paths: - users parameters: - name: groupIds - description: Comma-separated (no spaces!) list of GroupIDs to retrieve permissions for. + description: Comma-separated (no spaces!) list of GroupIDs to retrieve + permissions for. required: false in: query schema: @@ -415,7 +428,8 @@ paths: get: operationId: getMutuals summary: Get User Mutuals - description: Gets the counts of mutuals between the logged in user and the specified user + description: Gets the counts of mutuals between the logged in user and the + specified user tags: - users security: @@ -433,7 +447,8 @@ paths: get: operationId: getMutualFriends summary: Get User Mutual Friends - description: Gets a list of mutual friends between the logged in user and the specified user + description: Gets a list of mutual friends between the logged in user and the + specified user tags: - users security: @@ -451,7 +466,8 @@ paths: get: operationId: getMutualGroups summary: Get User Mutual Groups - description: Gets a list of mutual groups between the logged in user and the specified user + description: Gets a list of mutual groups between the logged in user and the + specified user tags: - users security: @@ -502,13 +518,16 @@ paths: $ref: ../responses/users/UserTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml "/users/{userId}/tutorial": parameters: - $ref: ../parameters.yaml#/userId get: operationId: getUserTutorialStatus summary: Get User Tutorial Status - description: Gets the status of completed or outstanding tutorials for the specified user. + description: Gets the status of completed or outstanding tutorials for the + specified user. tags: - users security: @@ -536,6 +555,8 @@ paths: description: The user's persistence data for the given world is deleted. "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/users/PersistenceOwnershipError.yaml "404": description: The user does not have persistence data for the given world. "/users/{userId}/{worldId}/persist/exists": @@ -556,6 +577,8 @@ paths: description: The user has persistence data for the given world. "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/users/PersistenceOwnershipError.yaml "404": description: The user does not have persistence data for the given world. "/users/{username}/name": @@ -584,6 +607,8 @@ paths: $ref: ../responses/users/UserResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/InvalidAdminCredentialsError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/worlds.yaml b/openapi/components/paths/worlds.yaml index 0563ca8d..c83e34b8 100644 --- a/openapi/components/paths/worlds.yaml +++ b/openapi/components/paths/worlds.yaml @@ -46,7 +46,9 @@ paths: post: operationId: createWorld summary: Create World - description: "Create a new world. This endpoint requires `assetUrl` to be a valid File object with `.vrcw` file extension, and `imageUrl` to be a valid File object with an image file extension." + description: "Create a new world. This endpoint requires `assetUrl` to be a + valid File object with `.vrcw` file extension, and `imageUrl` to be a + valid File object with an image file extension." tags: - worlds requestBody: @@ -183,6 +185,8 @@ paths: responses: "200": $ref: ../responses/worlds/WorldResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": @@ -190,7 +194,9 @@ paths: delete: operationId: deleteWorld summary: Delete World - description: 'Delete a world. Notice a world is never fully "deleted", only its ReleaseStatus is set to "hidden" and the linked Files are deleted. The WorldID is permanently reserved.' + description: 'Delete a world. Notice a world is never fully "deleted", only its + ReleaseStatus is set to "hidden" and the linked Files are deleted. The + WorldID is permanently reserved.' tags: - worlds security: @@ -231,9 +237,10 @@ paths: - $ref: ../parameters.yaml#/worldId get: operationId: getWorldMetadata - deprecated: true summary: Get World Metadata - description: Return a worlds custom metadata. This is currently believed to be unused. Metadata can be set with `updateWorld` and can be any arbitrary object. + description: Return a worlds custom metadata. This is currently believed to be + unused. Metadata can be set with `updateWorld` and can be any arbitrary + object. tags: - worlds security: [] @@ -309,13 +316,16 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "404": $ref: ../responses/worlds/WorldNotFoundError.yaml - "/worlds/{worldId}/removeTags": + "/worlds/{worldId}/deleteTags": parameters: - $ref: ../parameters.yaml#/worldId post: operationId: removeWorldTags summary: Remove World Tags - description: Removes tags from the world's profile + description: |- + Removes tags from the world's profile. + + The path is `deleteTags`, not `removeTags` as the user equivalent uses. tags: - worlds requestBody: @@ -333,6 +343,8 @@ paths: $ref: ../responses/worlds/WorldTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/InvalidAdminCredentialsError.yaml "/worlds/{worldId}/{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId diff --git a/openapi/components/requests/CreateGroupAnnouncementRequest.yaml b/openapi/components/requests/CreateGroupAnnouncementRequest.yaml index f6464a3b..818fe87b 100644 --- a/openapi/components/requests/CreateGroupAnnouncementRequest.yaml +++ b/openapi/components/requests/CreateGroupAnnouncementRequest.yaml @@ -19,5 +19,5 @@ properties: example: Event is starting soon! minLength: 1 required: - - favoriteId + - text - title diff --git a/openapi/components/requests/CreateInstanceRequest.yaml b/openapi/components/requests/CreateInstanceRequest.yaml index 5b48b7b0..72eb4316 100644 --- a/openapi/components/requests/CreateInstanceRequest.yaml +++ b/openapi/components/requests/CreateInstanceRequest.yaml @@ -18,7 +18,6 @@ properties: $ref: ../schemas/InstanceContentSettings.yaml displayName: type: string - nullable: true groupAccessType: $ref: ../schemas/GroupAccessType.yaml hardClose: diff --git a/openapi/components/requests/UpdateWorldRequest.yaml b/openapi/components/requests/UpdateWorldRequest.yaml index bc9ddc65..3807d26b 100644 --- a/openapi/components/requests/UpdateWorldRequest.yaml +++ b/openapi/components/requests/UpdateWorldRequest.yaml @@ -19,6 +19,10 @@ properties: minimum: 0 description: type: string + disabledPropAbilities: + type: array + items: + type: string imageUrl: type: string minLength: 1 @@ -27,8 +31,18 @@ properties: minLength: 1 platform: $ref: ../schemas/Platform.yaml + previewYoutubeId: + type: string + nullable: true + recommendedCapacity: + type: integer + example: 4 releaseStatus: $ref: ../schemas/ReleaseStatus.yaml + urlList: + type: array + items: + type: string tags: type: array description: " " diff --git a/openapi/components/responses/RequestValidationError.yaml b/openapi/components/responses/RequestValidationError.yaml new file mode 100644 index 00000000..6a2e357f --- /dev/null +++ b/openapi/components/responses/RequestValidationError.yaml @@ -0,0 +1,14 @@ +description: >- + The request body failed validation. VRChat validates the payload before it + looks the resource up, so this is returned even when the id in the path does + not exist. The message names the offending field. +content: + application/json: + examples: + Invalid Field: + value: + error: + message: "imageUrl must be a URL˸ 'string'‚ assetUrl must be a URL˸ 'string'" + status_code: 400 + schema: + $ref: ../schemas/Error.yaml diff --git a/openapi/components/responses/RouteNotImplementedError.yaml b/openapi/components/responses/RouteNotImplementedError.yaml new file mode 100644 index 00000000..a32c1cea --- /dev/null +++ b/openapi/components/responses/RouteNotImplementedError.yaml @@ -0,0 +1,10 @@ +description: The route is not served by VRChat. A live route answers 200 or 401. +content: + application/json: + examples: + Not Implemented: + value: + error: The endpoint you're looking for is not implemented by our system. + status_code: 404 + schema: + $ref: ../schemas/RouteNotImplemented.yaml diff --git a/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml new file mode 100644 index 00000000..852cde16 --- /dev/null +++ b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a short-lived redirect code for the current session. +content: + application/json: + schema: + $ref: ../../schemas/OAuthRedirectCode.yaml diff --git a/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml new file mode 100644 index 00000000..18a44473 --- /dev/null +++ b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml @@ -0,0 +1,11 @@ +description: Error response when the requested SSO provider is not supported. +content: + application/json: + examples: + Unsupported Provider: + value: + error: + message: '"That is not a supported SSO provider."' + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/authentication/SsoTokenResponse.yaml b/openapi/components/responses/authentication/SsoTokenResponse.yaml new file mode 100644 index 00000000..9383a319 --- /dev/null +++ b/openapi/components/responses/authentication/SsoTokenResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a token for the service. +content: + application/json: + schema: + $ref: ../../schemas/SsoToken.yaml diff --git a/openapi/components/responses/economy/AccountStateError.yaml b/openapi/components/responses/economy/AccountStateError.yaml new file mode 100644 index 00000000..6c101dcd --- /dev/null +++ b/openapi/components/responses/economy/AccountStateError.yaml @@ -0,0 +1,18 @@ +description: >- + Error response when the account is not in a state that supports the request, + such as one that has never been onboarded for payouts. +content: + application/json: + examples: + Account Invalid: + value: + error: + message: Account invalid + status_code: 400 + Invalid Account State: + value: + error: + message: Invalid account state + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/economy/ProductListingsForbiddenError.yaml b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml new file mode 100644 index 00000000..99cec173 --- /dev/null +++ b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when requesting the listings of another user. +content: + application/json: + examples: + Access Denied: + value: + error: + message: Access Denied + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/economy/StoresUnavailableError.yaml b/openapi/components/responses/economy/StoresUnavailableError.yaml new file mode 100644 index 00000000..526c95c4 --- /dev/null +++ b/openapi/components/responses/economy/StoresUnavailableError.yaml @@ -0,0 +1,11 @@ +description: Error response when the seller has no store available to the caller. +content: + application/json: + examples: + Stores Unavailable: + value: + error: + message: Stores unavailable + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/GroupPostsResponse.yaml b/openapi/components/responses/groups/GroupPostsResponse.yaml index 05e2ed36..d19c03b1 100644 --- a/openapi/components/responses/groups/GroupPostsResponse.yaml +++ b/openapi/components/responses/groups/GroupPostsResponse.yaml @@ -8,3 +8,5 @@ content: type: array items: $ref: ../../schemas/GroupPost.yaml + total: + type: integer diff --git a/openapi/components/responses/instances/InstanceBadRequestError.yaml b/openapi/components/responses/instances/InstanceBadRequestError.yaml new file mode 100644 index 00000000..5c30e42f --- /dev/null +++ b/openapi/components/responses/instances/InstanceBadRequestError.yaml @@ -0,0 +1,11 @@ +description: Bad request error response when creating an instance +content: + application/json: + examples: + Null Display Name: + value: + error: + message: "displayName must be a string˸ 'null' - 'object'‚ displayName must be a string˸ 'null'" + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/notifications/HideNotificationSuccess.yaml b/openapi/components/responses/notifications/HideNotificationSuccess.yaml new file mode 100644 index 00000000..91bb2b1c --- /dev/null +++ b/openapi/components/responses/notifications/HideNotificationSuccess.yaml @@ -0,0 +1,11 @@ +description: Successful response after hiding a notification. +content: + application/json: + examples: + Hide Success: + value: + success: + message: Ok + status_code: 200 + schema: + $ref: ../../schemas/Success.yaml diff --git a/openapi/components/responses/system/InfoPushBadRequestError.yaml b/openapi/components/responses/system/InfoPushBadRequestError.yaml new file mode 100644 index 00000000..80210dfd --- /dev/null +++ b/openapi/components/responses/system/InfoPushBadRequestError.yaml @@ -0,0 +1,11 @@ +description: Bad request error response when a list parameter is not an array. +content: + application/json: + examples: + Require Not An Array: + value: + error: + message: "Parameter `require` must be an array." + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/PersistenceOwnershipError.yaml b/openapi/components/responses/users/PersistenceOwnershipError.yaml new file mode 100644 index 00000000..30c2a7ed --- /dev/null +++ b/openapi/components/responses/users/PersistenceOwnershipError.yaml @@ -0,0 +1,12 @@ +description: >- + Error response when asking about another user's persistence data. The body + carries only a message string, without the nested `error` object every other + response in this description uses. +content: + application/json: + examples: + Not Your Persistence: + value: + error: You're not who I was expecting! + schema: + $ref: ../../schemas/BareError.yaml diff --git a/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml new file mode 100644 index 00000000..19e1802e --- /dev/null +++ b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when updating a user other than the authenticated one. +content: + application/json: + examples: + Not Yourself: + value: + error: + message: '"You can only edit yourself, not other users."' + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/UserNotFoundError.yaml b/openapi/components/responses/users/UserNotFoundError.yaml new file mode 100644 index 00000000..f2f8531e --- /dev/null +++ b/openapi/components/responses/users/UserNotFoundError.yaml @@ -0,0 +1,11 @@ +description: Error response when no user exists with the requested id. +content: + application/json: + examples: + User Not Found: + value: + error: + message: User usr_00000000-0000-0000-0000-000000000000 not Found + status_code: 404 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/UserResponse.yaml b/openapi/components/responses/users/UserResponse.yaml index 36b321a8..01ce5854 100644 --- a/openapi/components/responses/users/UserResponse.yaml +++ b/openapi/components/responses/users/UserResponse.yaml @@ -1,5 +1,17 @@ -description: Returns a single User object. +description: |- + Returns a single User object. + + Requesting your own ID returns your full `CurrentUser` record instead, carrying + the private fields (`emailVerified`, `steamDetails`, `twoFactorAuthEnabled`, …) + that are never present for another user. content: application/json: schema: - $ref: ../../schemas/User.yaml + x-if: + when: jsonschema + then: + oneOf: + - $ref: ../../schemas/User.yaml + - $ref: ../../schemas/CurrentUser.yaml + else: + $ref: ../../schemas/User.yaml diff --git a/openapi/components/schemas/APIConfig.yaml b/openapi/components/schemas/APIConfig.yaml index 79a21f94..a650f79a 100644 --- a/openapi/components/schemas/APIConfig.yaml +++ b/openapi/components/schemas/APIConfig.yaml @@ -1,6 +1,12 @@ title: APIConfig type: object -description: Global configuration for various features. +description: >- + Global configuration for various features. + + + The response carries decoy properties: plausible-looking names VRChat rerolls + at random as deliberate obfuscation. +additionalProperties: true properties: CampaignStatus: type: string @@ -119,6 +125,8 @@ properties: type: integer description: Unknown default: 30000 + clientMaxDatagrams: + type: integer clientNetDispatchThread: type: boolean description: Unknown @@ -171,6 +179,8 @@ properties: type: integer description: Unknown default: 15 + clientUseAck2: + type: boolean constants: $ref: ./APIConfigConstants.yaml contactEmail: @@ -327,6 +337,12 @@ properties: type: integer description: Unknown default: 1 + enableVRCPlusWorldLists: + type: boolean + eventShelfCampaigns: + type: array + items: + $ref: ./APIConfigEventShelfCampaign.yaml events: $ref: ./APIConfigEvents.yaml forceUseLatestWorld: @@ -336,10 +352,16 @@ properties: giftDisplayType: type: string description: Display type of gifts + globalCacheVersion: + type: integer + globalCacheVersionDefault: + type: integer googleApiClientId: type: string description: Unknown default: 827942544393-r2ouvckvouldn9dg9uruseje575e878f.apps.googleusercontent.com + googleApiUnityClientId: + type: string homeWorldId: $ref: ./WorldID.yaml homepageRedirectTarget: @@ -374,6 +396,20 @@ properties: type: string description: VRChat's job application email minLength: 1 + loadingScreenWeights: + type: object + description: Relative weight of each info-push category on the loading screen, per audience. + additionalProperties: + $ref: ./APIConfigLoadingScreenWeights.yaml + lowMemoryGoHomeTimeout: + type: object + description: Low-memory timeout, keyed by platform. + additionalProperties: + type: object + properties: + timeout: + type: integer + example: -1 maxUserEmoji: type: integer description: The maximum number of custom emoji each user may have at a given time. @@ -382,6 +418,9 @@ properties: type: integer description: The maximum number of custom stickers each user may have at a given time. default: 18 + maximumUnityVersionForUploads: + type: string + example: 2023.0.0f0 minSupportedClientBuildNumber: type: object description: Minimum supported client build number for various platforms @@ -416,7 +455,6 @@ properties: - GooglePlay - PC - PicoStore - - QuestAppLab - QuestStore - TestFlight - XRElite @@ -458,13 +496,32 @@ properties: type: string description: Currently used youtube-dl.exe hash in SHA1-delimited format minLength: 1 + player-url-resolver-sha1-gfn-override: + type: string + description: Overrides `player-url-resolver-sha1` on GeForce Now. player-url-resolver-version: type: string description: Currently used youtube-dl.exe version minLength: 1 + player-url-resolver-version-gfn-override: + type: string + description: Overrides `player-url-resolver-version` on GeForce Now. + example: 2026-07-04-GFN + profileDefaults: + $ref: ./APIConfigProfileDefaults.yaml + propComponentList: + type: array + description: SDK3 component type names. + items: + type: string publicKey: type: string description: Public key, hex encoded + questMinimumLowMemoryThreshold: + type: object + description: Low-memory threshold, keyed by platform. + additionalProperties: + type: integer reportCategories: type: object description: Categories available for reporting objectionable content @@ -560,6 +617,10 @@ properties: type: string description: Download link for game on the Steam website. minLength: 1 + voiceMaxPlaybackSourcesMobile: + type: integer + voiceMaxPlaybackSourcesPC: + type: integer websocketMaxFriendsRefreshDelay: type: integer description: Unknown @@ -634,7 +695,6 @@ required: - downloadUrls - dynamicWorldRows - economyLedgerBackfill - - economyLedgerMigrationStop - economyLedgerMode - economyPauseEnd - economyPauseStart diff --git a/openapi/components/schemas/APIConfigAudioConfig.yaml b/openapi/components/schemas/APIConfigAudioConfig.yaml index 56215dcb..3acdb0e6 100644 --- a/openapi/components/schemas/APIConfigAudioConfig.yaml +++ b/openapi/components/schemas/APIConfigAudioConfig.yaml @@ -14,6 +14,8 @@ properties: nearFieldILDNudgeEarRadius: type: number description: Unknown + nearFieldILDNudgeEarTranslate: + type: number perEarDirectionalityEarRadius: type: number description: Unknown @@ -35,6 +37,8 @@ properties: trackingScaleMultiplier: type: number description: Unknown + useLegacyILDNudging: + type: boolean required: - eq - nearFieldILDNudge diff --git a/openapi/components/schemas/APIConfigEventShelfCampaign.yaml b/openapi/components/schemas/APIConfigEventShelfCampaign.yaml new file mode 100644 index 00000000..d4a6d969 --- /dev/null +++ b/openapi/components/schemas/APIConfigEventShelfCampaign.yaml @@ -0,0 +1,16 @@ +title: APIConfigEventShelfCampaign +type: object +description: A seasonal campaign a group event can be listed under. +properties: + description: + type: string + example: Include this event in the VRChat Tanabata event shelf. + key: + type: string + example: tanabata + name: + type: string + example: Tanabata Homeworld Moderation +required: + - key + - name diff --git a/openapi/components/schemas/APIConfigEvents.yaml b/openapi/components/schemas/APIConfigEvents.yaml index 6632e54b..2398a2fc 100644 --- a/openapi/components/schemas/APIConfigEvents.yaml +++ b/openapi/components/schemas/APIConfigEvents.yaml @@ -31,6 +31,8 @@ properties: useDirectPlayerSerialization: type: boolean description: Unknown + useSparseRotationForPlayerSerialization: + type: boolean viewSegmentLength: type: integer description: Unknown diff --git a/openapi/components/schemas/APIConfigLoadingScreenWeights.yaml b/openapi/components/schemas/APIConfigLoadingScreenWeights.yaml new file mode 100644 index 00000000..7827698b --- /dev/null +++ b/openapi/components/schemas/APIConfigLoadingScreenWeights.yaml @@ -0,0 +1,12 @@ +title: APIConfigLoadingScreenWeights +type: object +properties: + announcement: + type: integer + example: 1 + informational: + type: integer + example: 89 + promotional: + type: integer + example: 10 diff --git a/openapi/components/schemas/APIConfigProfileDefaults.yaml b/openapi/components/schemas/APIConfigProfileDefaults.yaml new file mode 100644 index 00000000..0201e18f --- /dev/null +++ b/openapi/components/schemas/APIConfigProfileDefaults.yaml @@ -0,0 +1,19 @@ +title: APIConfigProfileDefaults +type: object +description: Default profile theme colours, each a hex RGB triplet without a leading `#`. +properties: + backgroundGradientBottom: + type: string + example: 9933FF + backgroundGradientTop: + type: string + example: 00C48A + themeButtonColor: + type: string + example: "009599" + themeIconColor: + type: string + example: 6BE4FA + themeSubtextColor: + type: string + example: A9A9A9 diff --git a/openapi/components/schemas/Avatar.yaml b/openapi/components/schemas/Avatar.yaml index c9adfec7..765ba15d 100644 --- a/openapi/components/schemas/Avatar.yaml +++ b/openapi/components/schemas/Avatar.yaml @@ -9,13 +9,15 @@ properties: description: Only present for the avatar author on avatars under active review. assetUrl: type: string - description: "Not present from general search `/avatars`, only on specific requests `/avatars/{avatarId}`." + description: "Not present from general search `/avatars`, only on specific + requests `/avatars/{avatarId}`." minLength: 1 assetUrlObject: type: object description: |- Not present from general search `/avatars`, only on specific requests `/avatars/{avatarId}`. **Deprecation:** `Object` has unknown usage/fields, and is always empty. Use normal `Url` field instead. + attribution: {} authorId: $ref: ./UserID.yaml authorName: @@ -115,7 +117,8 @@ properties: unityPackageUrlObject: deprecated: true type: object - description: "**Deprecation:** `Object` has unknown usage/fields, and is always empty. Use normal `Url` field instead." + description: "**Deprecation:** `Object` has unknown usage/fields, and is always + empty. Use normal `Url` field instead." properties: unityPackageUrl: type: string diff --git a/openapi/components/schemas/BareError.yaml b/openapi/components/schemas/BareError.yaml new file mode 100644 index 00000000..db0b955a --- /dev/null +++ b/openapi/components/schemas/BareError.yaml @@ -0,0 +1,12 @@ +title: BareError +type: object +description: >- + An error body carrying only a message string. Unlike `Error`, there is no + nested object and no `status_code`, so a consumer that assumes the usual + shape will read `undefined` from it. +properties: + error: + type: string + example: You're not who I was expecting! +required: + - error diff --git a/openapi/components/schemas/CalendarEvent.yaml b/openapi/components/schemas/CalendarEvent.yaml index 1e542e42..8cfd6fbf 100644 --- a/openapi/components/schemas/CalendarEvent.yaml +++ b/openapi/components/schemas/CalendarEvent.yaml @@ -48,6 +48,9 @@ properties: $ref: ./LanguageCode.yaml occurrenceKind: $ref: ./CalendarEventOccurrenceKind.yaml + occurrenceModified: + type: boolean + nullable: true ownerId: $ref: ./GroupID.yaml platforms: diff --git a/openapi/components/schemas/CalendarEventDiscovery.yaml b/openapi/components/schemas/CalendarEventDiscovery.yaml index cb89e81d..8b7651df 100644 --- a/openapi/components/schemas/CalendarEventDiscovery.yaml +++ b/openapi/components/schemas/CalendarEventDiscovery.yaml @@ -36,5 +36,4 @@ properties: items: $ref: ./CalendarEvent.yaml required: - - nextCursor - results diff --git a/openapi/components/schemas/CurrentUser.yaml b/openapi/components/schemas/CurrentUser.yaml index ba1217c5..126d1d78 100644 --- a/openapi/components/schemas/CurrentUser.yaml +++ b/openapi/components/schemas/CurrentUser.yaml @@ -42,6 +42,10 @@ properties: description: " " items: $ref: ./Badge.yaml + bannerColor: + type: string + bannerType: + type: string bio: type: string bioLinks: @@ -49,6 +53,10 @@ properties: description: " " items: type: string + completedTutorials: + type: array + items: + type: string contentFilters: type: array description: These tags begin with `content_` and control content gating @@ -88,6 +96,8 @@ properties: type: string friendKey: type: string + friendRequestStatus: + $ref: ./FriendRequestStatus.yaml friends: type: array items: @@ -112,16 +122,28 @@ properties: type: boolean homeLocation: $ref: ./WorldID.yaml + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml + instanceId: + $ref: ./InstanceID.yaml isAdult: type: boolean isBoopingEnabled: type: boolean default: true + isEconomyCreator: + type: boolean + default: false isFriend: type: boolean default: false + isTemporary: + type: boolean + default: false last_activity: type: string format: date-time @@ -134,6 +156,12 @@ properties: format: date-time last_platform: $ref: ./Platform.yaml + location: + $ref: ./LocationID.yaml + nameplateEffect: + type: string + note: + type: string obfuscatedEmail: type: string obfuscatedPendingEmail: @@ -153,8 +181,12 @@ properties: description: " " items: $ref: ./PastDisplayName.yaml + personalizationOptOut: + type: boolean picoId: type: string + platform: + type: string platform_history: type: array items: @@ -170,6 +202,8 @@ properties: format: date-time presence: $ref: ./CurrentUserPresence.yaml + profileEffect: + type: string profilePicOverride: type: string profilePicOverrideThumbnail: @@ -205,6 +239,13 @@ properties: type: array items: $ref: ./Tag.yaml + temporaryExpiryDate: {} + travelingToInstance: + type: string + travelingToLocation: + type: string + travelingToWorld: + type: string twitchDetails: type: object twitchId: @@ -231,12 +272,15 @@ properties: username: deprecated: true type: string - description: -| - **DEPRECATED:** VRChat API no longer return usernames of other users. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). + description: -| **DEPRECATED:** VRChat API no longer return usernames of other + users. [See issue by Tupper for more + information](https://github.com/pypy-vrc/VRCX/issues/429). usesGeneratedPassword: type: boolean viveId: type: string + worldId: + $ref: ./WorldID.yaml required: - acceptedTOSVersion - ageVerificationStatus diff --git a/openapi/components/schemas/CurrentUserPresence.yaml b/openapi/components/schemas/CurrentUserPresence.yaml index 84ac92f3..065a610e 100644 --- a/openapi/components/schemas/CurrentUserPresence.yaml +++ b/openapi/components/schemas/CurrentUserPresence.yaml @@ -1,9 +1,13 @@ title: CurrentUserPresence type: object properties: + avatarImageUrl: + type: string avatarThumbnail: type: string nullable: true + banner: + type: string currentAvatarTags: type: array items: @@ -17,6 +21,8 @@ properties: nullable: true items: $ref: ./GroupID.yaml + iconFrame: + type: string id: $ref: ./UserID.yaml instance: @@ -29,10 +35,14 @@ properties: isRejoining: type: string nullable: true + nameplateEffect: + type: string platform: $ref: ./Platform.yaml description: either a Platform or an empty string nullable: true + profileEffect: + type: string profilePicOverride: type: string nullable: true diff --git a/openapi/components/schemas/DynamicContentRow.yaml b/openapi/components/schemas/DynamicContentRow.yaml index 6a066511..e3dcf8bf 100644 --- a/openapi/components/schemas/DynamicContentRow.yaml +++ b/openapi/components/schemas/DynamicContentRow.yaml @@ -1,16 +1,89 @@ title: DynamicContentRow type: object properties: + anyStyle: + type: array + nullable: true + items: + type: string + anyTag: + type: array + nullable: true + items: + type: string + avatarSpecific: + type: boolean + bannersTag: + type: string + categories: + type: array + items: + type: string + featuredResults: + type: string index: type: integer minimum: 0 - name: + marketplace: + type: string + maxPrice: + type: integer + minOccupants: + type: integer + minPrice: + type: integer + minimumInterestCount: + type: integer + minimumRemainingMinutes: + type: integer + mode: type: string + n: + type: integer + name: minLength: 1 + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string + nonFeaturedResults: + type: string + notag: + type: array + nullable: true + items: + type: string + params: + type: object + additionalProperties: true + personalizedResults: + type: string + example: include platform: $ref: ./Platform.yaml description: 'Usually "ThisPlatformSupported", but can also be other values such as "all" or platform specific identifiers.' minLength: 1 + region: + type: string + nullable: true + scope: + type: string + example: all + shortName: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - type: "null" + - $ref: ./LocalizedString.yaml + else: + type: string + nullable: true sortHeading: type: string minLength: 1 @@ -20,17 +93,28 @@ properties: sortOwnership: type: string minLength: 1 + style: + type: string + nullable: true tag: - $ref: ./Tag.yaml - description: Tag to filter content for this row. - minLength: 1 + type: string + description: |- + Tag to filter content for this row. Not a `Tag`: that type forbids the + empty string, which this field uses for a row that is not tag-filtered. + nullable: true + example: admin_spotlight_pc + tags: + type: array + nullable: true + items: + $ref: ./Tag.yaml type: type: string description: Type is not present if it is a world. example: avatar + upcomingOffsetMinutes: + type: integer + example: 10080 required: - name - platform - - sortHeading - - sortOrder - - sortOwnership diff --git a/openapi/components/schemas/EconomyBalances.yaml b/openapi/components/schemas/EconomyBalances.yaml index eff1ee99..d77635d0 100644 --- a/openapi/components/schemas/EconomyBalances.yaml +++ b/openapi/components/schemas/EconomyBalances.yaml @@ -9,5 +9,4 @@ properties: type: integer required: - balance - - earnings - standard diff --git a/openapi/components/schemas/FavoritedWorld.yaml b/openapi/components/schemas/FavoritedWorld.yaml index 94144a4b..c1c18b55 100644 --- a/openapi/components/schemas/FavoritedWorld.yaml +++ b/openapi/components/schemas/FavoritedWorld.yaml @@ -18,6 +18,9 @@ properties: description: type: string minLength: 1 + disabledPropAbilities: + type: array + items: {} favoriteGroup: type: string minLength: 1 diff --git a/openapi/components/schemas/FileAnalysisAvatarStats.yaml b/openapi/components/schemas/FileAnalysisAvatarStats.yaml index 97c1d419..2f8b5db2 100644 --- a/openapi/components/schemas/FileAnalysisAvatarStats.yaml +++ b/openapi/components/schemas/FileAnalysisAvatarStats.yaml @@ -67,6 +67,8 @@ properties: type: integer physicsRigidbodies: type: integer + raycastCount: + type: integer skinnedMeshCount: type: integer skinnedMeshIndices: diff --git a/openapi/components/schemas/FriendRequestStatus.yaml b/openapi/components/schemas/FriendRequestStatus.yaml new file mode 100644 index 00000000..26bbfaaf --- /dev/null +++ b/openapi/components/schemas/FriendRequestStatus.yaml @@ -0,0 +1,4 @@ +title: FriendRequestStatus +type: string +description: State of a friend request between the caller and this user. VRChat sends the string `"null"`, not JSON `null`. +example: "null" diff --git a/openapi/components/schemas/Group.yaml b/openapi/components/schemas/Group.yaml index c8bbb748..e64115dd 100644 --- a/openapi/components/schemas/Group.yaml +++ b/openapi/components/schemas/Group.yaml @@ -1,98 +1,100 @@ -title: Group -type: object -properties: - ageVerificationBetaCode: - type: string - example: abc1234 - ageVerificationBetaSlots: - type: number - example: 500 - ageVerificationSlotsAvailable: - type: boolean - allowGroupJoinPrompt: - type: boolean - badges: - type: array - items: - type: string - bannerId: - type: string - nullable: true - bannerUrl: - type: string - nullable: true - createdAt: - type: string - format: date-time - description: - type: string - discriminator: - $ref: ./GroupDiscriminator.yaml - galleries: - type: array - items: - $ref: ./GroupGallery.yaml - iconId: - type: string - nullable: true - iconUrl: - type: string - nullable: true - id: - $ref: ./GroupID.yaml - isVerified: - type: boolean - default: false - joinState: - $ref: ./GroupJoinState.yaml - languages: - type: array - items: - type: string - lastPostCreatedAt: - type: string - nullable: true - format: date-time - links: - type: array - items: - type: string - memberCount: - type: integer - memberCountSyncedAt: - type: string - format: date-time - membershipStatus: - $ref: ./GroupMemberStatus.yaml - myMember: - $ref: ./GroupMyMember.yaml - nullable: true - name: - type: string - onlineMemberCount: - type: integer - ownerId: - $ref: ./UserID.yaml - privacy: - $ref: ./GroupPrivacy.yaml - roles: - type: array - description: Only returned if ?includeRoles=true is specified. - nullable: true - items: - $ref: ./GroupRole.yaml - rules: - type: string - nullable: true - shortCode: - $ref: ./GroupShortCode.yaml - tags: - type: array - items: - $ref: ./Tag.yaml - transferTargetId: - $ref: ./UserID.yaml - nullable: true - updatedAt: - type: string - format: date-time +title: Group +type: object +properties: + ageVerificationBetaCode: + type: string + example: abc1234 + ageVerificationBetaSlots: + type: number + example: 500 + ageVerificationSlotsAvailable: + type: boolean + allowGroupJoinPrompt: + type: boolean + badges: + type: array + items: + type: string + bannerId: + type: string + nullable: true + bannerUrl: + type: string + nullable: true + createdAt: + type: string + format: date-time + description: + type: string + discriminator: + $ref: ./GroupDiscriminator.yaml + galleries: + type: array + items: + $ref: ./GroupGallery.yaml + iconId: + type: string + nullable: true + iconUrl: + type: string + nullable: true + id: + $ref: ./GroupID.yaml + isVerified: + type: boolean + default: false + joinState: + $ref: ./GroupJoinState.yaml + languages: + type: array + items: + type: string + lastPostCreatedAt: + type: string + nullable: true + format: date-time + links: + type: array + items: + type: string + memberCount: + type: integer + memberCountSyncedAt: + type: string + format: date-time + membershipStatus: + $ref: ./GroupMemberStatus.yaml + myMember: + $ref: ./GroupMyMember.yaml + nullable: true + name: + type: string + nameplateId: {} + nameplateUrl: {} + onlineMemberCount: + type: integer + ownerId: + $ref: ./UserID.yaml + privacy: + $ref: ./GroupPrivacy.yaml + roles: + type: array + description: Only returned if ?includeRoles=true is specified. + nullable: true + items: + $ref: ./GroupRole.yaml + rules: + type: string + nullable: true + shortCode: + $ref: ./GroupShortCode.yaml + tags: + type: array + items: + $ref: ./Tag.yaml + transferTargetId: + $ref: ./UserID.yaml + nullable: true + updatedAt: + type: string + format: date-time diff --git a/openapi/components/schemas/GroupAnnouncement.yaml b/openapi/components/schemas/GroupAnnouncement.yaml index 6c99b050..07757316 100644 --- a/openapi/components/schemas/GroupAnnouncement.yaml +++ b/openapi/components/schemas/GroupAnnouncement.yaml @@ -1,9 +1,15 @@ title: GroupAnnouncement type: object +description: >- + An announcement is stored as a group post, so `POST /groups/{groupId}/announcement` + answers with the post fields below as well as the announcement ones. properties: authorId: $ref: ./UserID.yaml nullable: true + editorId: + $ref: ./UserID.yaml + nullable: true createdAt: type: string nullable: true @@ -20,6 +26,8 @@ properties: imageUrl: type: string nullable: true + roleIds: + $ref: ./GroupRoleIDList.yaml text: type: string nullable: true @@ -30,3 +38,5 @@ properties: type: string nullable: true format: date-time + visibility: + type: string diff --git a/openapi/components/schemas/GroupPermission.yaml b/openapi/components/schemas/GroupPermission.yaml index ca635a03..cb28e9ee 100644 --- a/openapi/components/schemas/GroupPermission.yaml +++ b/openapi/components/schemas/GroupPermission.yaml @@ -7,6 +7,11 @@ properties: description: Whether the user is allowed to add this permission to a role. default: false example: true + dependsOn: + type: array + description: Other permission names this one is listed against. + items: + $ref: ./GroupPermissions.yaml displayName: type: string description: The display name of the permission. diff --git a/openapi/components/schemas/GroupPost.yaml b/openapi/components/schemas/GroupPost.yaml index d1e43837..83431991 100644 --- a/openapi/components/schemas/GroupPost.yaml +++ b/openapi/components/schemas/GroupPost.yaml @@ -19,7 +19,7 @@ properties: imageUrl: type: string nullable: true - roleId: + roleIds: $ref: ./GroupRoleIDList.yaml text: type: string diff --git a/openapi/components/schemas/GroupRole.yaml b/openapi/components/schemas/GroupRole.yaml index a90688bf..7e6a3749 100644 --- a/openapi/components/schemas/GroupRole.yaml +++ b/openapi/components/schemas/GroupRole.yaml @@ -4,6 +4,9 @@ properties: createdAt: type: string format: date-time + defaultRole: + type: boolean + default: false description: type: string groupId: @@ -13,6 +16,9 @@ properties: isManagementRole: type: boolean default: false + isAddedOnJoin: + type: boolean + default: false isSelfAssignable: type: boolean default: false diff --git a/openapi/components/schemas/GroupRoleTemplateRole.yaml b/openapi/components/schemas/GroupRoleTemplateRole.yaml new file mode 100644 index 00000000..dc476ff5 --- /dev/null +++ b/openapi/components/schemas/GroupRoleTemplateRole.yaml @@ -0,0 +1,19 @@ +title: GroupRoleTemplateRole +type: object +description: A role a group role template creates alongside the everyone role. +properties: + description: + type: string + isAddedOnJoin: + type: boolean + default: false + name: + type: string + permissions: + type: array + items: + $ref: ./GroupPermissions.yaml +required: + - description + - name + - permissions diff --git a/openapi/components/schemas/GroupRoleTemplateValues.yaml b/openapi/components/schemas/GroupRoleTemplateValues.yaml index a14656cb..98d1582b 100644 --- a/openapi/components/schemas/GroupRoleTemplateValues.yaml +++ b/openapi/components/schemas/GroupRoleTemplateValues.yaml @@ -10,19 +10,9 @@ properties: name: type: string roles: - type: object - properties: - name: - type: string - description: - type: string - basePermissions: - type: array - items: - $ref: ./GroupPermissions.yaml - isAddedOnJoin: - type: boolean - default: false + type: array + items: + $ref: ./GroupRoleTemplateRole.yaml required: - basePermissions - description diff --git a/openapi/components/schemas/InfoPush.yaml b/openapi/components/schemas/InfoPush.yaml index 15d406bc..fd52b754 100644 --- a/openapi/components/schemas/InfoPush.yaml +++ b/openapi/components/schemas/InfoPush.yaml @@ -2,6 +2,7 @@ title: InfoPush type: object description: "" properties: + clientMinVersion: {} createdAt: type: string format: date-time @@ -9,7 +10,10 @@ properties: $ref: ./InfoPushData.yaml endDate: type: string + nullable: true format: date-time + experiment: + $ref: ./InfoPushExperiment.yaml hash: type: string description: "Unknown usage, MD5" @@ -23,11 +27,20 @@ properties: default: true priority: type: integer + regions: + type: array + items: + type: string releaseStatus: $ref: ./ReleaseStatus.yaml + requireClientTags: + type: array + items: + type: string startDate: type: string description: "" + nullable: true format: date-time tags: type: array diff --git a/openapi/components/schemas/InfoPushData.yaml b/openapi/components/schemas/InfoPushData.yaml index 7b3e2354..97f13d9e 100644 --- a/openapi/components/schemas/InfoPushData.yaml +++ b/openapi/components/schemas/InfoPushData.yaml @@ -4,20 +4,105 @@ description: "" properties: article: $ref: ./InfoPushDataArticle.yaml + authorName: + type: string + avatarId: + $ref: ./AvatarID.yaml + bannerImageUrl: + type: string + categories: + type: array + items: + $ref: ./InfoPushDataCategory.yaml + category: + type: string contentList: $ref: ./DynamicContentRow.yaml description: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string + disclaimerText: + type: string + domainList: + type: array + items: + type: object + properties: + domain: + type: string + featuredAvatarCategoryId: + type: string + finalName: + type: string + iconImageUrl: type: string imageUrl: type: string - minLength: 1 + nullable: true + ipsQuery: + $ref: ./InfoPushIpsQuery.yaml + isNew: + type: boolean + listingIds: + type: array + items: + type: string name: - type: string + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string onPressed: $ref: ./InfoPushDataClickable.yaml + overrideName: {} + rows: + type: integer + description: Number of rows to render. + nullable: true + search: + $ref: ./InfoPushDataSearch.yaml + shortName: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - type: "null" + - $ref: ./LocalizedString.yaml + else: + type: string + nullable: true template: type: string + thumbnailImageUrl: + type: string + nullable: true + tooltipDescription: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string version: type: string example: 2021.3.4 minLength: 1 + + weight: + type: integer + + worldTag: + type: string diff --git a/openapi/components/schemas/InfoPushDataArticle.yaml b/openapi/components/schemas/InfoPushDataArticle.yaml index 5f0c5d3d..a377bca6 100644 --- a/openapi/components/schemas/InfoPushDataArticle.yaml +++ b/openapi/components/schemas/InfoPushDataArticle.yaml @@ -2,4 +2,25 @@ title: InfoPushDataArticle type: object properties: content: - $ref: ./InfoPushDataArticleContent.yaml + type: array + items: + $ref: ./InfoPushDataArticleContent.yaml + + embeddedLinkData: + type: array + items: + $ref: ./InfoPushEmbeddedLink.yaml + + jumpLinks: + type: array + items: + type: string + moreInfoLinks: + type: array + items: + $ref: ./InfoPushEmbeddedLink.yaml + + sectionLinks: + type: array + items: + type: string diff --git a/openapi/components/schemas/InfoPushDataArticleContent.yaml b/openapi/components/schemas/InfoPushDataArticleContent.yaml index 5f07dd24..d4d64e37 100644 --- a/openapi/components/schemas/InfoPushDataArticleContent.yaml +++ b/openapi/components/schemas/InfoPushDataArticleContent.yaml @@ -1,9 +1,16 @@ title: InfoPushDataArticleContent type: object properties: + id: + type: string imageUrl: type: string onPressed: $ref: ./InfoPushDataClickable.yaml text: type: string + + title: + type: string + videoUrl: + type: string diff --git a/openapi/components/schemas/InfoPushDataCategory.yaml b/openapi/components/schemas/InfoPushDataCategory.yaml new file mode 100644 index 00000000..07629ca8 --- /dev/null +++ b/openapi/components/schemas/InfoPushDataCategory.yaml @@ -0,0 +1,22 @@ +title: InfoPushDataCategory +type: object +properties: + ids: + type: array + items: + type: string + ipsQuery: + $ref: ./InfoPushIpsQuery.yaml + maxCells: + type: integer + name: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string + type: + type: string diff --git a/openapi/components/schemas/InfoPushDataClickable.yaml b/openapi/components/schemas/InfoPushDataClickable.yaml index aebc89f5..988977de 100644 --- a/openapi/components/schemas/InfoPushDataClickable.yaml +++ b/openapi/components/schemas/InfoPushDataClickable.yaml @@ -10,9 +10,15 @@ properties: type: string enum: - CannedWorldSearch + - OpenAccountUpgrade + - OpenAvatarsMenu + - OpenHelpArticle + - OpenListingDetails - OpenSafetyMenu - OpenURL - OpenVRCPlusMenu + - OpenVRChatStore + - OpenWorldDetails example: OpenURL minLength: 1 required: diff --git a/openapi/components/schemas/InfoPushDataSearch.yaml b/openapi/components/schemas/InfoPushDataSearch.yaml new file mode 100644 index 00000000..1babbea0 --- /dev/null +++ b/openapi/components/schemas/InfoPushDataSearch.yaml @@ -0,0 +1,13 @@ +title: InfoPushDataSearch +type: object +properties: + searchContent: + type: string + searchInFields: + type: string + searchQuery: + type: string + searchTags: + type: string + sortBy: + type: string diff --git a/openapi/components/schemas/InfoPushEmbeddedLink.yaml b/openapi/components/schemas/InfoPushEmbeddedLink.yaml new file mode 100644 index 00000000..3c465592 --- /dev/null +++ b/openapi/components/schemas/InfoPushEmbeddedLink.yaml @@ -0,0 +1,13 @@ +title: InfoPushEmbeddedLink +type: object +properties: + parameters: + type: array + items: + type: string + command: + type: string + id: + type: string + name: + type: string diff --git a/openapi/components/schemas/InfoPushExperiment.yaml b/openapi/components/schemas/InfoPushExperiment.yaml new file mode 100644 index 00000000..b6832697 --- /dev/null +++ b/openapi/components/schemas/InfoPushExperiment.yaml @@ -0,0 +1,7 @@ +title: InfoPushExperiment +type: object +properties: + key: + type: string + variant: + type: string diff --git a/openapi/components/schemas/InfoPushIpsQuery.yaml b/openapi/components/schemas/InfoPushIpsQuery.yaml new file mode 100644 index 00000000..f8ad4db3 --- /dev/null +++ b/openapi/components/schemas/InfoPushIpsQuery.yaml @@ -0,0 +1,7 @@ +title: InfoPushIpsQuery +type: object +properties: + include: + type: string + require: + type: string diff --git a/openapi/components/schemas/Instance.yaml b/openapi/components/schemas/Instance.yaml index 68e81515..9be4d96e 100644 --- a/openapi/components/schemas/Instance.yaml +++ b/openapi/components/schemas/Instance.yaml @@ -36,9 +36,15 @@ properties: $ref: ./InstanceContentSettings.yaml creatorId: $ref: ./UserID.yaml + nullable: true + disabledPropAbilities: + type: array + items: {} displayName: type: string nullable: true + dominantLanguage: + type: string friends: $ref: ./UserID.yaml full: @@ -63,8 +69,14 @@ properties: instancePersistenceEnabled: type: boolean nullable: true + languageRatio: + type: object + additionalProperties: true location: $ref: ./LocationID.yaml + minimumAvatarPerformance: + type: string + nullable: true n_users: type: integer example: 6 diff --git a/openapi/components/schemas/InventoryDrop.yaml b/openapi/components/schemas/InventoryDrop.yaml index 1bf7f831..19c2fb80 100644 --- a/openapi/components/schemas/InventoryDrop.yaml +++ b/openapi/components/schemas/InventoryDrop.yaml @@ -11,6 +11,8 @@ properties: type: string nullable: true format: date-time + dropStatus: + type: string endDropDate: type: string example: "2184-07-24T00:00:00.000Z" @@ -27,9 +29,6 @@ properties: type: string example: "2025-06-09T10:00:00.000Z" format: date-time - status: - type: string - example: active tags: type: array items: @@ -55,7 +54,6 @@ required: - name - notificationDetails - startDropDate - - status - tags - targetGroup - templateIds diff --git a/openapi/components/schemas/InventoryItem.yaml b/openapi/components/schemas/InventoryItem.yaml index 8f51ba59..9b18c308 100644 --- a/openapi/components/schemas/InventoryItem.yaml +++ b/openapi/components/schemas/InventoryItem.yaml @@ -1,6 +1,9 @@ title: InventoryItem type: object properties: + acquisition: + type: string + attribution: {} collections: type: array items: @@ -42,6 +45,9 @@ properties: $ref: ./InventoryItemType.yaml itemTypeLabel: type: string + last_equipped: + type: object + additionalProperties: true metadata: $ref: ./InventoryMetadata.yaml name: diff --git a/openapi/components/schemas/InventoryMetadata.yaml b/openapi/components/schemas/InventoryMetadata.yaml index 01b35117..eca7eab2 100644 --- a/openapi/components/schemas/InventoryMetadata.yaml +++ b/openapi/components/schemas/InventoryMetadata.yaml @@ -20,3 +20,6 @@ properties: type: string propId: $ref: ./PropID.yaml + + propKind: + type: integer diff --git a/openapi/components/schemas/InventoryTemplate.yaml b/openapi/components/schemas/InventoryTemplate.yaml index 6ff21522..8c0f00de 100644 --- a/openapi/components/schemas/InventoryTemplate.yaml +++ b/openapi/components/schemas/InventoryTemplate.yaml @@ -1,6 +1,7 @@ title: InventoryTemplate type: object properties: + attribution: {} authorId: $ref: ./UserID.yaml collections: @@ -15,6 +16,8 @@ properties: type: object description: type: string + dropStatus: + type: string equipSlots: type: array items: @@ -63,7 +66,6 @@ required: - itemType - itemTypeLabel - name - - status - tags - updated_at - validateUserAttributes diff --git a/openapi/components/schemas/Jam.yaml b/openapi/components/schemas/Jam.yaml index 3b1bb2ad..b0b2a2d0 100644 --- a/openapi/components/schemas/Jam.yaml +++ b/openapi/components/schemas/Jam.yaml @@ -2,6 +2,9 @@ title: Jam type: object description: "" properties: + created_at: + type: string + format: date-time description: type: string minLength: 1 @@ -48,6 +51,8 @@ properties: title: type: string minLength: 1 + type: + type: string updated_at: type: string format: date-time diff --git a/openapi/components/schemas/JamSubmission.yaml b/openapi/components/schemas/JamSubmission.yaml index da2c8746..2c1a17a2 100644 --- a/openapi/components/schemas/JamSubmission.yaml +++ b/openapi/components/schemas/JamSubmission.yaml @@ -18,6 +18,8 @@ properties: ratingScore: type: integer minimum: 0 + ratingsScore: + type: integer submitterId: $ref: ../schemas/UserID.yaml required: diff --git a/openapi/components/schemas/LimitedGroup.yaml b/openapi/components/schemas/LimitedGroup.yaml index 254aaea2..e7015f78 100644 --- a/openapi/components/schemas/LimitedGroup.yaml +++ b/openapi/components/schemas/LimitedGroup.yaml @@ -35,6 +35,8 @@ properties: $ref: ./GroupMemberStatus.yaml name: type: string + nameplateId: {} + nameplateUrl: {} ownerId: $ref: ./UserID.yaml rules: diff --git a/openapi/components/schemas/LimitedUserFriend.yaml b/openapi/components/schemas/LimitedUserFriend.yaml index 7836fa87..d1644d77 100644 --- a/openapi/components/schemas/LimitedUserFriend.yaml +++ b/openapi/components/schemas/LimitedUserFriend.yaml @@ -2,6 +2,10 @@ title: LimitedUserFriend type: object description: User object received when querying your friends list properties: + bannerColor: + type: string + bannerType: + type: string bio: type: string bioLinks: @@ -19,10 +23,16 @@ properties: $ref: ./CurrentAvatarThumbnailImageUrl.yaml developerType: $ref: ./DeveloperType.yaml + discordId: + $ref: ./DiscordID.yaml displayName: type: string friendKey: type: string + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml imageUrl: @@ -45,8 +55,12 @@ properties: $ref: ./Platform.yaml location: type: string + nameplateEffect: + type: string platform: type: string + profileEffect: + type: string profilePicOverride: type: string profilePicOverrideThumbnail: diff --git a/openapi/components/schemas/LimitedUserGroups.yaml b/openapi/components/schemas/LimitedUserGroups.yaml index 4f3535e8..7774afb4 100644 --- a/openapi/components/schemas/LimitedUserGroups.yaml +++ b/openapi/components/schemas/LimitedUserGroups.yaml @@ -39,6 +39,8 @@ properties: type: boolean name: type: string + nameplateId: {} + nameplateUrl: {} ownerId: $ref: ./UserID.yaml privacy: diff --git a/openapi/components/schemas/LimitedWorld.yaml b/openapi/components/schemas/LimitedWorld.yaml index a0633ac7..ef4c4928 100644 --- a/openapi/components/schemas/LimitedWorld.yaml +++ b/openapi/components/schemas/LimitedWorld.yaml @@ -15,6 +15,9 @@ properties: format: date-time defaultContentSettings: $ref: ./InstanceContentSettings.yaml + disabledPropAbilities: + type: array + items: {} favorites: type: integer default: 0 diff --git a/openapi/components/schemas/LocalizedString.yaml b/openapi/components/schemas/LocalizedString.yaml new file mode 100644 index 00000000..7d4c36f3 --- /dev/null +++ b/openapi/components/schemas/LocalizedString.yaml @@ -0,0 +1,15 @@ +title: LocalizedString +type: object +description: A string the client resolves through its localization table, falling back to `fallback` when the key is unknown. +properties: + fallback: + type: string + description: The text to show when `key` cannot be resolved. + example: carnival + key: + type: string + description: The localization key. + example: SuggestedSearch/Carnival/Name/carnival +required: + - fallback + - key diff --git a/openapi/components/schemas/MutualFriend.yaml b/openapi/components/schemas/MutualFriend.yaml index 0f59242c..6c831381 100644 --- a/openapi/components/schemas/MutualFriend.yaml +++ b/openapi/components/schemas/MutualFriend.yaml @@ -4,6 +4,21 @@ description: User object received when querying mutual friends properties: avatarThumbnail: $ref: ./CurrentAvatarThumbnailImageUrl.yaml + bannerColor: + type: string + description: Hex colour without a leading `#`. + example: 3cc92c + bannerType: + type: string + example: color + iconFrame: + type: string + iconUrl: + type: string + nameplateEffect: + type: string + profileEffect: + type: string currentAvatarImageUrl: $ref: ./CurrentAvatarImageUrl.yaml currentAvatarTags: diff --git a/openapi/components/schemas/NotificationDetailEmpty.yaml b/openapi/components/schemas/NotificationDetailEmpty.yaml index fc874d4a..9a3bda67 100644 --- a/openapi/components/schemas/NotificationDetailEmpty.yaml +++ b/openapi/components/schemas/NotificationDetailEmpty.yaml @@ -1,2 +1,6 @@ title: NotificationDetailEmpty type: object +description: >- + The absence of details, serialized as `{}`. Constrained so it cannot also + match a populated branch of the `details` union. +additionalProperties: false diff --git a/openapi/components/schemas/NotificationV2.yaml b/openapi/components/schemas/NotificationV2.yaml index 8f673483..571dfc93 100644 --- a/openapi/components/schemas/NotificationV2.yaml +++ b/openapi/components/schemas/NotificationV2.yaml @@ -25,6 +25,7 @@ properties: $ref: ./NotificationV2DataGeneric.yaml details: $ref: ./NotificationV2DetailsBoop.yaml + displayData: {} expiresAt: type: string format: date-time @@ -42,9 +43,12 @@ properties: type: boolean link: type: string - example: "event:grp_00000000-0000-0000-0000-000000000000,cal_00000000-0000-0000-0000-000000000000" + nullable: true + example: "event:grp_00000000-0000-0000-0000-000000000000,cal_00000000-0000-0000\ + -0000-000000000000" linkText: type: string + nullable: true linkTextKey: type: string nullable: true @@ -69,6 +73,7 @@ properties: type: boolean senderUserId: $ref: ./UserID.yaml + nullable: true senderUsername: type: string nullable: true diff --git a/openapi/components/schemas/NotificationV2DataEmpty.yaml b/openapi/components/schemas/NotificationV2DataEmpty.yaml index 61db4d34..47ec8311 100644 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ b/openapi/components/schemas/NotificationV2DataEmpty.yaml @@ -1,2 +1,7 @@ title: NotificationV2DataEmpty type: object +description: The payload for a notification type that carries no data. +# Without this the branch matches any object, so every populated `data` also +# satisfies it and the union stops discriminating: a `badge.earned` payload +# matched both this and `NotificationV2DataBadgeEarned`. +additionalProperties: false diff --git a/openapi/components/schemas/OAuthRedirectCode.yaml b/openapi/components/schemas/OAuthRedirectCode.yaml new file mode 100644 index 00000000..f72bee39 --- /dev/null +++ b/openapi/components/schemas/OAuthRedirectCode.yaml @@ -0,0 +1,10 @@ +title: OAuthRedirectCode +type: object +description: A short-lived code used to hand the current session to an OAuth redirect. +properties: + code: + type: string + minLength: 1 + example: redirect_00000000-0000-0000-0000-000000000000 +required: + - code diff --git a/openapi/components/schemas/PrivateProfile.yaml b/openapi/components/schemas/PrivateProfile.yaml index 565f7ddb..81ce666e 100644 --- a/openapi/components/schemas/PrivateProfile.yaml +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -5,10 +5,13 @@ properties: $ref: ./PrivateProfileActivity.yaml id: $ref: ./UserID.yaml + friendRequestStatus: + $ref: ./FriendRequestStatus.yaml isFriend: type: boolean note: type: string + nullable: true status: $ref: ./UserStatus.yaml statusDescription: diff --git a/openapi/components/schemas/ProductListing.yaml b/openapi/components/schemas/ProductListing.yaml index 213eecd2..d3d6654f 100644 --- a/openapi/components/schemas/ProductListing.yaml +++ b/openapi/components/schemas/ProductListing.yaml @@ -5,8 +5,15 @@ properties: type: boolean archived: type: boolean + attribution: + $ref: ./ProductListingAttribution.yaml buyerRefundable: type: boolean + collabUserDisplayName: + type: string + nullable: true + collabUserId: + $ref: ./UserID.yaml created: type: string format: date-time @@ -30,6 +37,10 @@ properties: nullable: true hasAvatar: type: boolean + hasCompanion: + type: boolean + hasInventory: + type: boolean hasUdon: type: boolean hydratedProducts: @@ -60,11 +71,15 @@ properties: $ref: ./ProductID.yaml productType: $ref: ./ProductType.yaml + productTypes: + type: array + items: + type: string products: type: array + description: Product ids. The products themselves arrive in `hydratedProducts`. items: - type: object - description: Either a ProductID or a Product, depending on hydration + $ref: ./ProductID.yaml purchaseCount: type: integer purchaseCountQuantity: @@ -86,7 +101,7 @@ properties: storeIds: type: array items: - type: string + $ref: ./StoreID.yaml subtitle: type: string tags: diff --git a/openapi/components/schemas/ProductListingAttribution.yaml b/openapi/components/schemas/ProductListingAttribution.yaml new file mode 100644 index 00000000..901f1049 --- /dev/null +++ b/openapi/components/schemas/ProductListingAttribution.yaml @@ -0,0 +1,8 @@ +title: ProductListingAttribution +type: object +description: Attribution shown alongside a listing. +properties: + creator: + $ref: ./ProductListingAttributionCreator.yaml + publisher: + $ref: ./ProductListingAttributionCreator.yaml diff --git a/openapi/components/schemas/ProductListingAttributionCreator.yaml b/openapi/components/schemas/ProductListingAttributionCreator.yaml new file mode 100644 index 00000000..f565eff5 --- /dev/null +++ b/openapi/components/schemas/ProductListingAttributionCreator.yaml @@ -0,0 +1,8 @@ +title: ProductListingAttributionCreator +type: object +description: The creator credited on a listing. +properties: + customName: + type: string + userId: + $ref: ./UserID.yaml diff --git a/openapi/components/schemas/PublicProfile.yaml b/openapi/components/schemas/PublicProfile.yaml index 5bcd8a6c..c88cec16 100644 --- a/openapi/components/schemas/PublicProfile.yaml +++ b/openapi/components/schemas/PublicProfile.yaml @@ -44,9 +44,8 @@ properties: pronouns: type: string representedGroup: + $ref: ./ProfileRepresentedGroup.yaml nullable: true - allOf: - - $ref: ./ProfileRepresentedGroup.yaml themeId: type: string trustTags: diff --git a/openapi/components/schemas/ReportCategory.yaml b/openapi/components/schemas/ReportCategory.yaml index c3c7a94f..72063109 100644 --- a/openapi/components/schemas/ReportCategory.yaml +++ b/openapi/components/schemas/ReportCategory.yaml @@ -1,19 +1,23 @@ -title: ReportCategory -type: object -description: A category used for reporting content -properties: - description: - type: string - description: The description of the report category - text: - type: string - description: The label of the report category - title: - type: string - description: The title of the report category - tooltip: - type: string - description: The tooltip that describes the category -required: - - text - - tooltip +title: ReportCategory +type: object +description: A category used for reporting content +properties: + description: + type: string + description: The description of the report category + ipsArticle: + type: string + order: + type: integer + text: + type: string + description: The label of the report category + title: + type: string + description: The title of the report category + tooltip: + type: string + description: The tooltip that describes the category +required: + - text + - tooltip diff --git a/openapi/components/schemas/ReportReason.yaml b/openapi/components/schemas/ReportReason.yaml index 3da1d81b..a2a29fe3 100644 --- a/openapi/components/schemas/ReportReason.yaml +++ b/openapi/components/schemas/ReportReason.yaml @@ -1,13 +1,17 @@ -title: ReportReason -type: object -description: A reason used for reporting users -properties: - text: - type: string - description: The label or name of the report reason - tooltip: - type: string - description: A brief explanation of what this reason entails -required: - - text +title: ReportReason +type: object +description: A reason used for reporting users +properties: + policy: + type: array + items: + type: string + text: + type: string + description: The label or name of the report reason + tooltip: + type: string + description: A brief explanation of what this reason entails +required: + - text - tooltip diff --git a/openapi/components/schemas/RepresentedGroup.yaml b/openapi/components/schemas/RepresentedGroup.yaml index 8aebf7a6..350516df 100644 --- a/openapi/components/schemas/RepresentedGroup.yaml +++ b/openapi/components/schemas/RepresentedGroup.yaml @@ -27,6 +27,8 @@ properties: $ref: ./GroupUserVisibility.yaml name: type: string + nameplateId: {} + nameplateUrl: {} ownerId: $ref: ./UserID.yaml privacy: diff --git a/openapi/components/schemas/RouteNotImplemented.yaml b/openapi/components/schemas/RouteNotImplemented.yaml new file mode 100644 index 00000000..466c7eee --- /dev/null +++ b/openapi/components/schemas/RouteNotImplemented.yaml @@ -0,0 +1,16 @@ +title: RouteNotImplemented +type: object +description: >- + The body VRChat returns for a route it does not serve. Note the shape differs + from every other error in this description: `error` is a string here, not an + `Error` object with `message` and `status_code` inside it. +properties: + error: + type: string + example: The endpoint you're looking for is not implemented by our system. + status_code: + type: integer + example: 404 +required: + - error + - status_code diff --git a/openapi/components/schemas/SsoProvider.yaml b/openapi/components/schemas/SsoProvider.yaml new file mode 100644 index 00000000..7fbd589f --- /dev/null +++ b/openapi/components/schemas/SsoProvider.yaml @@ -0,0 +1,9 @@ +title: SsoProvider +type: string +description: >- + A third-party service VRChat mints an SSO token for. Anything else is refused + with "That is not a supported SSO provider." +enum: + - canny + - furality +example: canny diff --git a/openapi/components/schemas/SsoToken.yaml b/openapi/components/schemas/SsoToken.yaml new file mode 100644 index 00000000..5363a7ae --- /dev/null +++ b/openapi/components/schemas/SsoToken.yaml @@ -0,0 +1,9 @@ +title: SsoToken +type: object +description: A token for a third-party service. +properties: + token: + type: string + minLength: 1 +required: + - token diff --git a/openapi/components/schemas/StoreShelf.yaml b/openapi/components/schemas/StoreShelf.yaml index 929de186..05ad68b4 100644 --- a/openapi/components/schemas/StoreShelf.yaml +++ b/openapi/components/schemas/StoreShelf.yaml @@ -15,10 +15,16 @@ properties: type: array items: $ref: ./ProductListing.yaml + shelfBackgroundImageId: + $ref: ./FileID.yaml shelfDescription: type: string + shelfIconImageId: + $ref: ./FileID.yaml shelfLayout: type: string + shelfTabBackgroundImageId: + $ref: ./FileID.yaml shelfTitle: type: string updatedAt: diff --git a/openapi/components/schemas/Subscription.yaml b/openapi/components/schemas/Subscription.yaml index ecdc8cac..e441380b 100644 --- a/openapi/components/schemas/Subscription.yaml +++ b/openapi/components/schemas/Subscription.yaml @@ -7,8 +7,16 @@ properties: appleProductId: type: string minLength: 1 + bulkSize: + type: integer + description: How many subscriptions a gifted bundle grants. + example: 5 description: type: string + discountPercentage: + type: integer + description: Discount applied to a gifted bundle. + example: 10 googlePlanId: type: string googleProductId: @@ -22,6 +30,7 @@ properties: minLength: 1 period: $ref: ./SubscriptionPeriod.yaml + periodAmount: {} picoSku: type: string minLength: 1 diff --git a/openapi/components/schemas/Transaction.yaml b/openapi/components/schemas/Transaction.yaml index cc14489a..4205596b 100644 --- a/openapi/components/schemas/Transaction.yaml +++ b/openapi/components/schemas/Transaction.yaml @@ -3,7 +3,14 @@ type: object description: "" properties: agreement: - $ref: ./TransactionAgreement.yaml + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./TransactionAgreement.yaml + else: + $ref: ./TransactionAgreement.yaml created_at: type: string format: date-time diff --git a/openapi/components/schemas/User.yaml b/openapi/components/schemas/User.yaml index 677fde27..a9268586 100644 --- a/openapi/components/schemas/User.yaml +++ b/openapi/components/schemas/User.yaml @@ -1,6 +1,17 @@ title: User type: object properties: + acceptedPrivacyVersion: + type: integer + acceptedTOSVersion: + type: integer + accountDeletionDate: + type: string + nullable: true + accountDeletionLog: + type: array + nullable: true + items: {} ageVerificationStatus: $ref: ./AgeVerificationStatus.yaml ageVerified: @@ -8,11 +19,16 @@ properties: allowAvatarCopying: type: boolean default: true + appleDetails: + type: object + additionalProperties: true badges: type: array description: " " items: $ref: ./Badge.yaml + bannerColor: + type: string bannerType: type: string bannerUrl: @@ -44,7 +60,7 @@ properties: friendKey: type: string friendRequestStatus: - type: string + $ref: ./FriendRequestStatus.yaml iconFrame: type: string iconUrl: diff --git a/openapi/components/schemas/World.yaml b/openapi/components/schemas/World.yaml index 59f70387..69baa478 100644 --- a/openapi/components/schemas/World.yaml +++ b/openapi/components/schemas/World.yaml @@ -18,6 +18,9 @@ properties: description: type: string minLength: 0 + disabledPropAbilities: + type: array + items: {} favorites: type: integer default: 0 @@ -41,9 +44,13 @@ properties: description: Will always be an empty list when unauthenticated. items: type: array + description: |- + A fixed triple of instance id, occupant count, and the share of + occupants per language code. OpenAPI 3.0 cannot type the positions + individually, so the members are only bounded by length. items: {} - maxItems: 2 - minItems: 2 + maxItems: 3 + minItems: 3 labsPublicationDate: type: string example: none @@ -92,6 +99,9 @@ properties: example: 4 releaseStatus: $ref: ./ReleaseStatus.yaml + slimInstances: + type: array + items: {} storeId: $ref: ./StoreID.yaml tags: diff --git a/openapi/components/tags.yaml b/openapi/components/tags.yaml index 49f1eb7d..3407cc4d 100644 --- a/openapi/components/tags.yaml +++ b/openapi/components/tags.yaml @@ -55,3 +55,8 @@ - name: worlds description: $ref: ./paths/worlds.yaml#/info/description +- name: deprecated + description: >- + Routes VRChat no longer serves: every observed call answers the generic + "not implemented" 404. They stay described, and the conformance suite keeps + calling them, so a route that comes back shows up. From 3dd5831cc6b44ec8a36640bbee3feafae57cee22 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:02:32 -0400 Subject: [PATCH 02/17] style(openapi): remove explanatory yaml comments --- openapi/components/paths/calendar.yaml | 4 ---- openapi/components/paths/instances.yaml | 4 ---- openapi/components/schemas/NotificationV2DataEmpty.yaml | 3 --- 3 files changed, 11 deletions(-) diff --git a/openapi/components/paths/calendar.yaml b/openapi/components/paths/calendar.yaml index 6ee97c79..e4e83aa4 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -45,8 +45,6 @@ paths: - $ref: ../parameters.yaml#/calendarDiscoveryUpcomingOffsetMinutes - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/calendarDiscoveryNextCursor - # Answers an anonymous caller with real results, so the session is - # optional rather than required. security: - {} - authCookie: [] @@ -66,8 +64,6 @@ paths: - $ref: ../parameters.yaml#/monthDate - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset - # Answers an anonymous caller, so the session is optional rather than - # required. security: - {} - authCookie: [] diff --git a/openapi/components/paths/instances.yaml b/openapi/components/paths/instances.yaml index b670245f..040cee4a 100644 --- a/openapi/components/paths/instances.yaml +++ b/openapi/components/paths/instances.yaml @@ -80,8 +80,6 @@ paths: If an invalid instanceId is provided, this endpoint will simply return "null"! tags: - instances - # Answers an anonymous caller, so the session is optional rather than - # required. security: - {} - authCookie: [] @@ -135,8 +133,6 @@ paths: description: Returns an instance short name. tags: - instances - # Answers an anonymous caller, so the session is optional rather than - # required. security: - {} - authCookie: [] diff --git a/openapi/components/schemas/NotificationV2DataEmpty.yaml b/openapi/components/schemas/NotificationV2DataEmpty.yaml index 47ec8311..9a9ae3b2 100644 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ b/openapi/components/schemas/NotificationV2DataEmpty.yaml @@ -1,7 +1,4 @@ title: NotificationV2DataEmpty type: object description: The payload for a notification type that carries no data. -# Without this the branch matches any object, so every populated `data` also -# satisfies it and the union stops discriminating: a `badge.earned` payload -# matched both this and `NotificationV2DataBadgeEarned`. additionalProperties: false From 8b83722698ece96d5b6b34f322ac092ee81a1f16 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:02:46 -0400 Subject: [PATCH 03/17] style(openapi): sort keys and sequence values to satisfy eslint --- openapi/components/parameters.yaml | 22 +++---- openapi/components/paths.yaml | 12 ++-- openapi/components/paths/authentication.yaml | 42 +++++++------- openapi/components/paths/economy.yaml | 12 ++-- openapi/components/paths/props.yaml | 6 +- openapi/components/paths/users.yaml | 2 +- openapi/components/paths/worlds.yaml | 58 +++++++++---------- .../requests/UpdateWorldRequest.yaml | 8 +-- .../system/InfoPushBadRequestError.yaml | 2 +- openapi/components/schemas/APIConfig.yaml | 6 +- .../components/schemas/GroupAnnouncement.yaml | 6 +- openapi/components/schemas/GroupRole.yaml | 4 +- openapi/components/schemas/MutualFriend.yaml | 16 ++--- .../components/schemas/OAuthRedirectCode.yaml | 2 +- .../components/schemas/PrivateProfile.yaml | 4 +- 15 files changed, 100 insertions(+), 102 deletions(-) diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index f352132c..b11e5eff 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -254,13 +254,13 @@ favoriteGroupName: in: path schema: $ref: ./schemas/FavoriteName.yaml -ssoProvider: - name: provider - description: The third-party service to mint a token for. +favoriteGroupType: + name: favoriteGroupType + description: "The type of group to fetch, must be a valid FavoriteType." required: true in: path schema: - $ref: ./schemas/SsoProvider.yaml + $ref: ./schemas/FavoriteType.yaml favoriteGroupTypeQuery: name: type description: Filter the returned groups to a single favourite type. @@ -268,13 +268,6 @@ favoriteGroupTypeQuery: in: query schema: $ref: ./schemas/FavoriteType.yaml -favoriteGroupType: - name: favoriteGroupType - description: "The type of group to fetch, must be a valid FavoriteType." - required: true - in: path - schema: - $ref: ./schemas/FavoriteType.yaml favoriteId: name: favoriteId description: Must be a valid favorite ID. @@ -832,6 +825,13 @@ sortProductPurchase: in: query schema: $ref: ./schemas/SortOptionProductPurchase.yaml +ssoProvider: + name: provider + description: The third-party service to mint a token for. + required: true + in: path + schema: + $ref: ./schemas/SsoProvider.yaml startDate: name: startDate description: The start date of the search range. diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index a3bd8372..2ecc87cb 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -296,10 +296,6 @@ $ref: "./paths/economy.yaml#/paths/~1listing~1{productId}" /logout: $ref: "./paths/authentication.yaml#/paths/~1logout" -/oauth/redirectCode: - $ref: "./paths/authentication.yaml#/paths/~1oauth~1redirectCode" -"/sso/{provider}": - $ref: "./paths/authentication.yaml#/paths/~1sso~1{provider}" "/message/{userId}/{messageType}": $ref: "./paths/invite.yaml#/paths/~1message~1{userId}~1{messageType}" "/message/{userId}/{messageType}/{slot}": @@ -318,6 +314,8 @@ $ref: "./paths/notifications.yaml#/paths/~1notifications~1{notificationId}~1respond" "/notifications/{notificationId}/see": $ref: "./paths/notifications.yaml#/paths/~1notifications~1{notificationId}~1see" +/oauth/redirectCode: + $ref: "./paths/authentication.yaml#/paths/~1oauth~1redirectCode" /permissions: $ref: "./paths/miscellaneous.yaml#/paths/~1permissions" "/permissions/{permissionId}": @@ -348,6 +346,8 @@ $ref: "./paths/invite.yaml#/paths/~1requestInvite~1{userId}~1photo" /reward/redeem: $ref: "./paths/inventory.yaml#/paths/~1reward~1redeem" +"/sso/{provider}": + $ref: "./paths/authentication.yaml#/paths/~1sso~1{provider}" /subscriptions: $ref: "./paths/economy.yaml#/paths/~1subscriptions" /tilia/status: @@ -462,13 +462,13 @@ $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}" "/worlds/{worldId}/addTags": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1addTags" +"/worlds/{worldId}/deleteTags": + $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1deleteTags" "/worlds/{worldId}/metadata": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1metadata" "/worlds/{worldId}/platform/{publishedPlatform}": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1platform~1{publishedPlatform}" "/worlds/{worldId}/publish": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1publish" -"/worlds/{worldId}/deleteTags": - $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1deleteTags" "/worlds/{worldId}/{instanceId}": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1{instanceId}" diff --git a/openapi/components/paths/authentication.yaml b/openapi/components/paths/authentication.yaml index d36cf408..27e409ea 100644 --- a/openapi/components/paths/authentication.yaml +++ b/openapi/components/paths/authentication.yaml @@ -399,27 +399,6 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/InvalidAdminCredentialsError.yaml - "/users/{userId}/delete": - parameters: - - $ref: ../parameters.yaml#/userId - put: - operationId: deleteUser - summary: Delete User - description: |- - Deletes the account with given ID. Normal users only have permission to delete their own account. Account deletion is 14 days from this request, and will be cancelled if you do an authenticated request with the account afterwards. - - **VRC+ NOTE:** Despite the 14-days cooldown, any VRC+ subscription will be cancelled **immediately**. - - **METHOD NOTE:** Despite this being a Delete action, the method type required is PUT. - tags: - - authentication - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/authentication/DeleteUserResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml /oauth/redirectCode: get: operationId: getOAuthRedirectCode @@ -452,6 +431,27 @@ paths: $ref: ../responses/authentication/SsoProviderUnsupportedError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/users/{userId}/delete": + parameters: + - $ref: ../parameters.yaml#/userId + put: + operationId: deleteUser + summary: Delete User + description: |- + Deletes the account with given ID. Normal users only have permission to delete their own account. Account deletion is 14 days from this request, and will be cancelled if you do an authenticated request with the account afterwards. + + **VRC+ NOTE:** Despite the 14-days cooldown, any VRC+ subscription will be cancelled **immediately**. + + **METHOD NOTE:** Despite this being a Delete action, the method type required is PUT. + tags: + - authentication + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/authentication/DeleteUserResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/economy.yaml b/openapi/components/paths/economy.yaml index e07472a4..afdbb3b6 100644 --- a/openapi/components/paths/economy.yaml +++ b/openapi/components/paths/economy.yaml @@ -223,8 +223,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -486,8 +486,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -569,8 +569,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -741,8 +741,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -761,8 +761,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy requestBody: content: application/json: @@ -790,8 +790,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index acdda025..24082308 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -120,8 +120,8 @@ paths: **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - - props - deprecated + - props security: - authCookie: [] responses: @@ -142,8 +142,8 @@ paths: **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - - props - deprecated + - props security: - authCookie: [] responses: @@ -164,8 +164,8 @@ paths: **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - - props - deprecated + - props security: - authCookie: [] responses: diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index 646a4339..91e07c36 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -130,8 +130,8 @@ paths: description: "**REQUIRES ADMIN CREDENTIALS**. Search and list any Active users by text query." tags: - - users - deprecated + - users parameters: - name: search description: Username to search for diff --git a/openapi/components/paths/worlds.yaml b/openapi/components/paths/worlds.yaml index c83e34b8..1b803162 100644 --- a/openapi/components/paths/worlds.yaml +++ b/openapi/components/paths/worlds.yaml @@ -232,6 +232,35 @@ paths: $ref: ../responses/worlds/WorldTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/worlds/{worldId}/deleteTags": + parameters: + - $ref: ../parameters.yaml#/worldId + post: + operationId: removeWorldTags + summary: Remove World Tags + description: |- + Removes tags from the world's profile. + + The path is `deleteTags`, not `removeTags` as the user equivalent uses. + tags: + - worlds + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/ChangeWorldTagsRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/worlds/WorldResponse.yaml + "400": + $ref: ../responses/worlds/WorldTagInvalidError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/InvalidAdminCredentialsError.yaml "/worlds/{worldId}/metadata": parameters: - $ref: ../parameters.yaml#/worldId @@ -316,35 +345,6 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "404": $ref: ../responses/worlds/WorldNotFoundError.yaml - "/worlds/{worldId}/deleteTags": - parameters: - - $ref: ../parameters.yaml#/worldId - post: - operationId: removeWorldTags - summary: Remove World Tags - description: |- - Removes tags from the world's profile. - - The path is `deleteTags`, not `removeTags` as the user equivalent uses. - tags: - - worlds - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/ChangeWorldTagsRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/worlds/WorldResponse.yaml - "400": - $ref: ../responses/worlds/WorldTagInvalidError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/InvalidAdminCredentialsError.yaml "/worlds/{worldId}/{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId diff --git a/openapi/components/requests/UpdateWorldRequest.yaml b/openapi/components/requests/UpdateWorldRequest.yaml index 3807d26b..d8ef5f1d 100644 --- a/openapi/components/requests/UpdateWorldRequest.yaml +++ b/openapi/components/requests/UpdateWorldRequest.yaml @@ -39,10 +39,6 @@ properties: example: 4 releaseStatus: $ref: ../schemas/ReleaseStatus.yaml - urlList: - type: array - items: - type: string tags: type: array description: " " @@ -56,3 +52,7 @@ properties: default: 5.3.4p1 example: 2022.3.6f1 minLength: 1 + urlList: + type: array + items: + type: string diff --git a/openapi/components/responses/system/InfoPushBadRequestError.yaml b/openapi/components/responses/system/InfoPushBadRequestError.yaml index 80210dfd..e033bb83 100644 --- a/openapi/components/responses/system/InfoPushBadRequestError.yaml +++ b/openapi/components/responses/system/InfoPushBadRequestError.yaml @@ -5,7 +5,7 @@ content: Require Not An Array: value: error: - message: "Parameter `require` must be an array." + message: Parameter `require` must be an array. status_code: 400 schema: $ref: ../../schemas/Error.yaml diff --git a/openapi/components/schemas/APIConfig.yaml b/openapi/components/schemas/APIConfig.yaml index a650f79a..6160e2ea 100644 --- a/openapi/components/schemas/APIConfig.yaml +++ b/openapi/components/schemas/APIConfig.yaml @@ -1,11 +1,9 @@ title: APIConfig type: object -description: >- +description: |- Global configuration for various features. - - The response carries decoy properties: plausible-looking names VRChat rerolls - at random as deliberate obfuscation. + The response carries decoy properties: plausible-looking names VRChat rerolls at random as deliberate obfuscation. additionalProperties: true properties: CampaignStatus: diff --git a/openapi/components/schemas/GroupAnnouncement.yaml b/openapi/components/schemas/GroupAnnouncement.yaml index 07757316..d7e680dd 100644 --- a/openapi/components/schemas/GroupAnnouncement.yaml +++ b/openapi/components/schemas/GroupAnnouncement.yaml @@ -7,13 +7,13 @@ properties: authorId: $ref: ./UserID.yaml nullable: true - editorId: - $ref: ./UserID.yaml - nullable: true createdAt: type: string nullable: true format: date-time + editorId: + $ref: ./UserID.yaml + nullable: true groupId: $ref: ./GroupID.yaml nullable: true diff --git a/openapi/components/schemas/GroupRole.yaml b/openapi/components/schemas/GroupRole.yaml index 7e6a3749..4f9f8ecf 100644 --- a/openapi/components/schemas/GroupRole.yaml +++ b/openapi/components/schemas/GroupRole.yaml @@ -13,10 +13,10 @@ properties: $ref: ./GroupID.yaml id: $ref: ./GroupRoleID.yaml - isManagementRole: + isAddedOnJoin: type: boolean default: false - isAddedOnJoin: + isManagementRole: type: boolean default: false isSelfAssignable: diff --git a/openapi/components/schemas/MutualFriend.yaml b/openapi/components/schemas/MutualFriend.yaml index 6c831381..48f23da9 100644 --- a/openapi/components/schemas/MutualFriend.yaml +++ b/openapi/components/schemas/MutualFriend.yaml @@ -11,14 +11,6 @@ properties: bannerType: type: string example: color - iconFrame: - type: string - iconUrl: - type: string - nameplateEffect: - type: string - profileEffect: - type: string currentAvatarImageUrl: $ref: ./CurrentAvatarImageUrl.yaml currentAvatarTags: @@ -29,10 +21,18 @@ properties: $ref: ./CurrentAvatarThumbnailImageUrl.yaml displayName: type: string + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml imageUrl: type: string + nameplateEffect: + type: string + profileEffect: + type: string profilePicOverride: type: string status: diff --git a/openapi/components/schemas/OAuthRedirectCode.yaml b/openapi/components/schemas/OAuthRedirectCode.yaml index f72bee39..fddd2817 100644 --- a/openapi/components/schemas/OAuthRedirectCode.yaml +++ b/openapi/components/schemas/OAuthRedirectCode.yaml @@ -4,7 +4,7 @@ description: A short-lived code used to hand the current session to an OAuth red properties: code: type: string - minLength: 1 example: redirect_00000000-0000-0000-0000-000000000000 + minLength: 1 required: - code diff --git a/openapi/components/schemas/PrivateProfile.yaml b/openapi/components/schemas/PrivateProfile.yaml index 81ce666e..0447a6dc 100644 --- a/openapi/components/schemas/PrivateProfile.yaml +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -3,10 +3,10 @@ type: object properties: activity: $ref: ./PrivateProfileActivity.yaml - id: - $ref: ./UserID.yaml friendRequestStatus: $ref: ./FriendRequestStatus.yaml + id: + $ref: ./UserID.yaml isFriend: type: boolean note: From 0edb83ec894b4606c4863cbaed3c3d27b21b5dfe Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:58:16 -0400 Subject: [PATCH 04/17] fix(openapi): drop JamSubmission ratingScore, which the API never returns --- openapi/components/schemas/JamSubmission.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/openapi/components/schemas/JamSubmission.yaml b/openapi/components/schemas/JamSubmission.yaml index 2c1a17a2..cd0aabef 100644 --- a/openapi/components/schemas/JamSubmission.yaml +++ b/openapi/components/schemas/JamSubmission.yaml @@ -15,9 +15,6 @@ properties: $ref: ../schemas/JamSubmissionID.yaml jamId: $ref: ../schemas/JamID.yaml - ratingScore: - type: integer - minimum: 0 ratingsScore: type: integer submitterId: From 4840043eadc59a279a611b96ade41af18d82310c Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 14:53:15 -0400 Subject: [PATCH 05/17] refactor(openapi): merge the two empty notification schemas into one --- openapi/components/schemas/NotificationDetailEmpty.yaml | 6 ------ openapi/components/schemas/NotificationEmpty.yaml | 6 ++++++ openapi/components/schemas/NotificationV2.yaml | 2 +- openapi/components/schemas/NotificationV2DataEmpty.yaml | 4 ---- openapi/components/schemas/SentNotification.yaml | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 openapi/components/schemas/NotificationDetailEmpty.yaml create mode 100644 openapi/components/schemas/NotificationEmpty.yaml delete mode 100644 openapi/components/schemas/NotificationV2DataEmpty.yaml diff --git a/openapi/components/schemas/NotificationDetailEmpty.yaml b/openapi/components/schemas/NotificationDetailEmpty.yaml deleted file mode 100644 index 9a3bda67..00000000 --- a/openapi/components/schemas/NotificationDetailEmpty.yaml +++ /dev/null @@ -1,6 +0,0 @@ -title: NotificationDetailEmpty -type: object -description: >- - The absence of details, serialized as `{}`. Constrained so it cannot also - match a populated branch of the `details` union. -additionalProperties: false diff --git a/openapi/components/schemas/NotificationEmpty.yaml b/openapi/components/schemas/NotificationEmpty.yaml new file mode 100644 index 00000000..a16384d8 --- /dev/null +++ b/openapi/components/schemas/NotificationEmpty.yaml @@ -0,0 +1,6 @@ +title: NotificationEmpty +type: object +description: >- + A notification that carries no payload, serialized as `{}`. Constrained so it + cannot also match a populated branch of the union it appears in. +additionalProperties: false diff --git a/openapi/components/schemas/NotificationV2.yaml b/openapi/components/schemas/NotificationV2.yaml index 571dfc93..99ce7b4f 100644 --- a/openapi/components/schemas/NotificationV2.yaml +++ b/openapi/components/schemas/NotificationV2.yaml @@ -14,7 +14,7 @@ properties: when: jsonschema then: oneOf: - - $ref: ./NotificationV2DataEmpty.yaml + - $ref: ./NotificationEmpty.yaml - $ref: ./NotificationV2DataBadgeEarned.yaml - $ref: ./NotificationV2DataBoop.yaml - $ref: ./NotificationV2DataEventAnnouncement.yaml diff --git a/openapi/components/schemas/NotificationV2DataEmpty.yaml b/openapi/components/schemas/NotificationV2DataEmpty.yaml deleted file mode 100644 index 9a9ae3b2..00000000 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ /dev/null @@ -1,4 +0,0 @@ -title: NotificationV2DataEmpty -type: object -description: The payload for a notification type that carries no data. -additionalProperties: false diff --git a/openapi/components/schemas/SentNotification.yaml b/openapi/components/schemas/SentNotification.yaml index 1f49a160..5a78f462 100644 --- a/openapi/components/schemas/SentNotification.yaml +++ b/openapi/components/schemas/SentNotification.yaml @@ -10,7 +10,7 @@ properties: when: jsonschema then: oneOf: - - $ref: ./NotificationDetailEmpty.yaml + - $ref: ./NotificationEmpty.yaml - $ref: ./NotificationDetailBoop.yaml - $ref: ./NotificationDetailInvite.yaml - $ref: ./NotificationDetailInviteResponse.yaml From 737a6c92b3d74c6448320d725717fc4e80b94206 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:25:26 -0400 Subject: [PATCH 06/17] refactor(openapi): merge the duplicate error responses into shared components --- .../responses/RequestValidationError.yaml | 16 ++++++++++--- .../responses/ResourceNotFoundError.yaml | 24 +++++++++++++++++++ .../responses/RouteNotImplementedError.yaml | 2 +- .../OAuthRedirectCodeResponse.yaml | 2 +- .../SsoProviderUnsupportedError.yaml | 2 +- .../authentication/SsoTokenResponse.yaml | 2 +- .../avatars/AvatarNotFoundError.yaml | 21 ---------------- .../calendar/CalendarEventNotFoundError.yaml | 11 --------- .../responses/economy/AccountStateError.yaml | 2 +- .../ProductListingsForbiddenError.yaml | 2 +- .../economy/StoresUnavailableError.yaml | 2 +- .../favorites/FavoriteNotFoundError.yaml | 11 --------- .../responses/files/FileDeletedError.yaml | 11 --------- .../responses/files/FileNotFoundError.yaml | 11 --------- .../friends/UserDoesntExistError.yaml | 11 --------- .../responses/groups/GroupNotFoundError.yaml | 11 --------- .../instances/InstanceBadRequestError.yaml | 11 --------- .../instances/InstanceNotFoundError.yaml | 11 --------- .../responses/jams/JamNotFoundError.yaml | 11 --------- .../HideNotificationSuccess.yaml | 2 +- .../NotificationNotFoundError.yaml | 11 --------- .../responses/props/NoSuchPropError.yaml | 11 --------- .../system/InfoPushBadRequestError.yaml | 11 --------- .../users/PersistenceOwnershipError.yaml | 2 +- .../users/UpdateOtherUserForbiddenError.yaml | 2 +- .../responses/users/UserNotFoundError.yaml | 11 --------- .../responses/users/UserResponse.yaml | 4 ++-- .../responses/worlds/WorldNotFoundError.yaml | 11 --------- 28 files changed, 49 insertions(+), 190 deletions(-) create mode 100644 openapi/components/responses/ResourceNotFoundError.yaml delete mode 100644 openapi/components/responses/avatars/AvatarNotFoundError.yaml delete mode 100644 openapi/components/responses/calendar/CalendarEventNotFoundError.yaml delete mode 100644 openapi/components/responses/favorites/FavoriteNotFoundError.yaml delete mode 100644 openapi/components/responses/files/FileDeletedError.yaml delete mode 100644 openapi/components/responses/files/FileNotFoundError.yaml delete mode 100644 openapi/components/responses/friends/UserDoesntExistError.yaml delete mode 100644 openapi/components/responses/groups/GroupNotFoundError.yaml delete mode 100644 openapi/components/responses/instances/InstanceBadRequestError.yaml delete mode 100644 openapi/components/responses/instances/InstanceNotFoundError.yaml delete mode 100644 openapi/components/responses/jams/JamNotFoundError.yaml delete mode 100644 openapi/components/responses/notifications/NotificationNotFoundError.yaml delete mode 100644 openapi/components/responses/props/NoSuchPropError.yaml delete mode 100644 openapi/components/responses/system/InfoPushBadRequestError.yaml delete mode 100644 openapi/components/responses/users/UserNotFoundError.yaml delete mode 100644 openapi/components/responses/worlds/WorldNotFoundError.yaml diff --git a/openapi/components/responses/RequestValidationError.yaml b/openapi/components/responses/RequestValidationError.yaml index 6a2e357f..6e1c006f 100644 --- a/openapi/components/responses/RequestValidationError.yaml +++ b/openapi/components/responses/RequestValidationError.yaml @@ -1,7 +1,7 @@ description: >- - The request body failed validation. VRChat validates the payload before it - looks the resource up, so this is returned even when the id in the path does - not exist. The message names the offending field. + The request failed validation. VRChat validates the request before it looks + up the resource, so this response is returned even when the ID in the path does + not exist. The message names the offending field or parameter. content: application/json: examples: @@ -10,5 +10,15 @@ content: error: message: "imageUrl must be a URL˸ 'string'‚ assetUrl must be a URL˸ 'string'" status_code: 400 + Missing Seller: + value: + error: + message: You must specify a sellerId + status_code: 400 + Require Not An Array: + value: + error: + message: Parameter `require` must be an array․ + status_code: 400 schema: $ref: ../schemas/Error.yaml diff --git a/openapi/components/responses/ResourceNotFoundError.yaml b/openapi/components/responses/ResourceNotFoundError.yaml new file mode 100644 index 00000000..18472010 --- /dev/null +++ b/openapi/components/responses/ResourceNotFoundError.yaml @@ -0,0 +1,24 @@ +description: >- + The requested resource does not exist. The message varies by resource and by + route, and only some name the id. Worlds sometimes answer `model + not found` instead of `World not found`. +content: + application/json: + examples: + File: + value: + error: + message: File not found + status_code: 404 + Group: + value: + error: + message: Group not foundǃ + status_code: 404 + Notification: + value: + error: + message: Cannot find notification․ + status_code: 404 + schema: + $ref: ../schemas/Error.yaml diff --git a/openapi/components/responses/RouteNotImplementedError.yaml b/openapi/components/responses/RouteNotImplementedError.yaml index a32c1cea..f43bae09 100644 --- a/openapi/components/responses/RouteNotImplementedError.yaml +++ b/openapi/components/responses/RouteNotImplementedError.yaml @@ -1,4 +1,4 @@ -description: The route is not served by VRChat. A live route answers 200 or 401. +description: VRChat does not serve this route. A live route answers 200 or 401. content: application/json: examples: diff --git a/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml index 852cde16..98d9524f 100644 --- a/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml +++ b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml @@ -1,4 +1,4 @@ -description: Returns a short-lived redirect code for the current session. +description: Return a short-lived redirect code for the current session. content: application/json: schema: diff --git a/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml index 18a44473..6dde2e1d 100644 --- a/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml +++ b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml @@ -1,4 +1,4 @@ -description: Error response when the requested SSO provider is not supported. +description: Error response when the requested SSO provider is unsupported. content: application/json: examples: diff --git a/openapi/components/responses/authentication/SsoTokenResponse.yaml b/openapi/components/responses/authentication/SsoTokenResponse.yaml index 9383a319..627ead59 100644 --- a/openapi/components/responses/authentication/SsoTokenResponse.yaml +++ b/openapi/components/responses/authentication/SsoTokenResponse.yaml @@ -1,4 +1,4 @@ -description: Returns a token for the service. +description: Return a token for the service. content: application/json: schema: diff --git a/openapi/components/responses/avatars/AvatarNotFoundError.yaml b/openapi/components/responses/avatars/AvatarNotFoundError.yaml deleted file mode 100644 index 42b0c9f5..00000000 --- a/openapi/components/responses/avatars/AvatarNotFoundError.yaml +++ /dev/null @@ -1,21 +0,0 @@ -description: Error response when trying to show information about a non-existent avatar. -content: - application/json: - examples: - 404 Avatar Not Found: - value: - error: - message: Avatar Not Found - status_code: 404 - 404 Can't find avatar: - value: - error: - message: "Can't find avatar!" - status_code: 404 - 404 Couldn't find that avatar: - value: - error: - message: "We couldn't find that avatar!" - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/calendar/CalendarEventNotFoundError.yaml b/openapi/components/responses/calendar/CalendarEventNotFoundError.yaml deleted file mode 100644 index 0b657746..00000000 --- a/openapi/components/responses/calendar/CalendarEventNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to download ICS calendar of a non-existent calendar entry, get such a calendar entry, or get the next event for a group that lacks any future scheduled events. -content: - application/json: - examples: - 404 File Not Found: - value: - error: - message: Calendar Entry not foundǃ # U+01c3 as per the API - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/economy/AccountStateError.yaml b/openapi/components/responses/economy/AccountStateError.yaml index 6c101dcd..ce3be238 100644 --- a/openapi/components/responses/economy/AccountStateError.yaml +++ b/openapi/components/responses/economy/AccountStateError.yaml @@ -1,6 +1,6 @@ description: >- Error response when the account is not in a state that supports the request, - such as one that has never been onboarded for payouts. + such as an account never onboarded for payouts. content: application/json: examples: diff --git a/openapi/components/responses/economy/ProductListingsForbiddenError.yaml b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml index 99cec173..54bdf83e 100644 --- a/openapi/components/responses/economy/ProductListingsForbiddenError.yaml +++ b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml @@ -1,4 +1,4 @@ -description: Error response when requesting the listings of another user. +description: Error response when requesting another user's product listings. content: application/json: examples: diff --git a/openapi/components/responses/economy/StoresUnavailableError.yaml b/openapi/components/responses/economy/StoresUnavailableError.yaml index 526c95c4..7da81879 100644 --- a/openapi/components/responses/economy/StoresUnavailableError.yaml +++ b/openapi/components/responses/economy/StoresUnavailableError.yaml @@ -1,4 +1,4 @@ -description: Error response when the seller has no store available to the caller. +description: Error response when the seller's stores are unavailable to the caller. content: application/json: examples: diff --git a/openapi/components/responses/favorites/FavoriteNotFoundError.yaml b/openapi/components/responses/favorites/FavoriteNotFoundError.yaml deleted file mode 100644 index 52a9b3f4..00000000 --- a/openapi/components/responses/favorites/FavoriteNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent favorite. -content: - application/json: - examples: - 404 Favorite not found: - value: - error: - message: "404 couldn't find that favorite" - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/files/FileDeletedError.yaml b/openapi/components/responses/files/FileDeletedError.yaml deleted file mode 100644 index 23f5fdb2..00000000 --- a/openapi/components/responses/files/FileDeletedError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to delete a non-existent file. -content: - application/json: - examples: - File Deleted Error: - value: - error: - message: File 'file_ce35d830-e20a-4df0-a6d4-5aaef4508044' not found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/files/FileNotFoundError.yaml b/openapi/components/responses/files/FileNotFoundError.yaml deleted file mode 100644 index 83deb8f2..00000000 --- a/openapi/components/responses/files/FileNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent file. -content: - application/json: - examples: - 404 File Not Found: - value: - error: - message: File 'file_ce35d830-e20a-4df0-a6d4-5aaef4508044' not found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/friends/UserDoesntExistError.yaml b/openapi/components/responses/friends/UserDoesntExistError.yaml deleted file mode 100644 index e41384a2..00000000 --- a/openapi/components/responses/friends/UserDoesntExistError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to send a friend request to a user which doesn't exist. -content: - application/json: - examples: - 404 User Doesn't Exist Response: - value: - error: - message: user doesn't existǃ - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/GroupNotFoundError.yaml b/openapi/components/responses/groups/GroupNotFoundError.yaml deleted file mode 100644 index b2beb651..00000000 --- a/openapi/components/responses/groups/GroupNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to perform operations on a non-existing group. -content: - application/json: - examples: - 404 World Not Found: - value: - error: - message: Can't find groupǃ - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/instances/InstanceBadRequestError.yaml b/openapi/components/responses/instances/InstanceBadRequestError.yaml deleted file mode 100644 index 5c30e42f..00000000 --- a/openapi/components/responses/instances/InstanceBadRequestError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Bad request error response when creating an instance -content: - application/json: - examples: - Null Display Name: - value: - error: - message: "displayName must be a string˸ 'null' - 'object'‚ displayName must be a string˸ 'null'" - status_code: 400 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/instances/InstanceNotFoundError.yaml b/openapi/components/responses/instances/InstanceNotFoundError.yaml deleted file mode 100644 index feeac723..00000000 --- a/openapi/components/responses/instances/InstanceNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response due to non existent instance -content: - application/json: - examples: - Instance Not Found Example: - value: - error: - message: '"Instance not found"' - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/jams/JamNotFoundError.yaml b/openapi/components/responses/jams/JamNotFoundError.yaml deleted file mode 100644 index 31fc6ea3..00000000 --- a/openapi/components/responses/jams/JamNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent jam. -content: - application/json: - examples: - 404 Jam not found: - value: - error: - message: "404 id must be an ID˸ 'invalid_id_here'" - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/notifications/HideNotificationSuccess.yaml b/openapi/components/responses/notifications/HideNotificationSuccess.yaml index 91bb2b1c..787128e5 100644 --- a/openapi/components/responses/notifications/HideNotificationSuccess.yaml +++ b/openapi/components/responses/notifications/HideNotificationSuccess.yaml @@ -1,4 +1,4 @@ -description: Successful response after hiding a notification. +description: Response from successfully hiding a notification. content: application/json: examples: diff --git a/openapi/components/responses/notifications/NotificationNotFoundError.yaml b/openapi/components/responses/notifications/NotificationNotFoundError.yaml deleted file mode 100644 index 98375079..00000000 --- a/openapi/components/responses/notifications/NotificationNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to perform operations on a non-existing notification. -content: - application/json: - examples: - 404 World Not Found: - value: - error: - message: Notification not found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/props/NoSuchPropError.yaml b/openapi/components/responses/props/NoSuchPropError.yaml deleted file mode 100644 index 9653b508..00000000 --- a/openapi/components/responses/props/NoSuchPropError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to perform operations on a non-existing prop. -content: - application/json: - examples: - 404 Prop Not Found: - value: - error: - message: That prop does not exist. - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/system/InfoPushBadRequestError.yaml b/openapi/components/responses/system/InfoPushBadRequestError.yaml deleted file mode 100644 index e033bb83..00000000 --- a/openapi/components/responses/system/InfoPushBadRequestError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Bad request error response when a list parameter is not an array. -content: - application/json: - examples: - Require Not An Array: - value: - error: - message: Parameter `require` must be an array. - status_code: 400 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/PersistenceOwnershipError.yaml b/openapi/components/responses/users/PersistenceOwnershipError.yaml index 30c2a7ed..0022876f 100644 --- a/openapi/components/responses/users/PersistenceOwnershipError.yaml +++ b/openapi/components/responses/users/PersistenceOwnershipError.yaml @@ -1,5 +1,5 @@ description: >- - Error response when asking about another user's persistence data. The body + Error response when querying another user's persistence data. The body carries only a message string, without the nested `error` object every other response in this description uses. content: diff --git a/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml index 19e1802e..35a3af97 100644 --- a/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml +++ b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml @@ -1,4 +1,4 @@ -description: Error response when updating a user other than the authenticated one. +description: Error response when updating a user other than yourself. content: application/json: examples: diff --git a/openapi/components/responses/users/UserNotFoundError.yaml b/openapi/components/responses/users/UserNotFoundError.yaml deleted file mode 100644 index f2f8531e..00000000 --- a/openapi/components/responses/users/UserNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when no user exists with the requested id. -content: - application/json: - examples: - User Not Found: - value: - error: - message: User usr_00000000-0000-0000-0000-000000000000 not Found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/UserResponse.yaml b/openapi/components/responses/users/UserResponse.yaml index 01ce5854..7e1ca8b9 100644 --- a/openapi/components/responses/users/UserResponse.yaml +++ b/openapi/components/responses/users/UserResponse.yaml @@ -1,9 +1,9 @@ description: |- - Returns a single User object. + Return a single User object. Requesting your own ID returns your full `CurrentUser` record instead, carrying the private fields (`emailVerified`, `steamDetails`, `twoFactorAuthEnabled`, …) - that are never present for another user. + that never appear in responses for another user. content: application/json: schema: diff --git a/openapi/components/responses/worlds/WorldNotFoundError.yaml b/openapi/components/responses/worlds/WorldNotFoundError.yaml deleted file mode 100644 index 428967fc..00000000 --- a/openapi/components/responses/worlds/WorldNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent world. Sometimes returns with `model not found` instead of `World Date: Sat, 8 Aug 2026 19:25:56 -0400 Subject: [PATCH 07/17] refactor(openapi): retarget merged responses and rewrite descriptions --- openapi/components/parameters.yaml | 2 +- openapi/components/paths/authentication.yaml | 10 +-- openapi/components/paths/avatars.yaml | 14 ++-- openapi/components/paths/calendar.yaml | 9 ++- openapi/components/paths/economy.yaml | 41 +++------- openapi/components/paths/favorites.yaml | 4 +- openapi/components/paths/files.yaml | 12 +-- openapi/components/paths/friends.yaml | 4 +- openapi/components/paths/groups.yaml | 84 ++++++++++---------- openapi/components/paths/instances.yaml | 6 +- openapi/components/paths/invite.yaml | 2 +- openapi/components/paths/jams.yaml | 8 +- openapi/components/paths/miscellaneous.yaml | 6 +- openapi/components/paths/notifications.yaml | 12 +-- openapi/components/paths/props.yaml | 21 ++--- openapi/components/paths/users.yaml | 10 +-- openapi/components/paths/worlds.yaml | 18 ++--- openapi/components/tags.yaml | 6 +- 18 files changed, 122 insertions(+), 147 deletions(-) diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index b11e5eff..d1dcd230 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -263,7 +263,7 @@ favoriteGroupType: $ref: ./schemas/FavoriteType.yaml favoriteGroupTypeQuery: name: type - description: Filter the returned groups to a single favourite type. + description: Filter to a single favorite group type. required: false in: query schema: diff --git a/openapi/components/paths/authentication.yaml b/openapi/components/paths/authentication.yaml index 27e409ea..5f671238 100644 --- a/openapi/components/paths/authentication.yaml +++ b/openapi/components/paths/authentication.yaml @@ -58,11 +58,11 @@ paths: deprecated: true summary: Register User Account description: |- - ~~Register a new user account.~~ + Register a new user account. - **DEPRECATED:** Automated creation of accounts has no legitimate public third-party use case, and would be in violation of ToS §13.2: + Automated creation of accounts has no legitimate public third-party use case, and would violate ToS §13.2: *By using the Platform, you agree not to: i. [...] use the Platform in a manner inconsistent with individual human usage* - This endpoint is documented in the interest of completeness + This endpoint is documented in the interest of completeness. tags: - authentication parameters: [] @@ -403,7 +403,7 @@ paths: get: operationId: getOAuthRedirectCode summary: Get OAuth Redirect Code - description: Mints a short-lived code that hands the current session to an OAuth redirect. + description: Generate a short-lived OAuth redirect code for the current session. tags: - authentication security: @@ -419,7 +419,7 @@ paths: get: operationId: getSsoToken summary: Get SSO Token - description: Returns a token for the given third-party service. + description: Generate a token for the specified third-party service. tags: - authentication security: diff --git a/openapi/components/paths/avatars.yaml b/openapi/components/paths/avatars.yaml index 86401c66..f45bc233 100644 --- a/openapi/components/paths/avatars.yaml +++ b/openapi/components/paths/avatars.yaml @@ -152,7 +152,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateAvatar summary: Update Avatar @@ -174,7 +174,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteAvatar summary: Delete Avatar @@ -191,7 +191,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/impostor": parameters: - $ref: ../parameters.yaml#/avatarId @@ -209,7 +209,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/impostor/enqueue": parameters: - $ref: ../parameters.yaml#/avatarId @@ -227,7 +227,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/select": parameters: - $ref: ../parameters.yaml#/avatarId @@ -245,7 +245,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/selectFallback": parameters: - $ref: ../parameters.yaml#/avatarId @@ -265,7 +265,7 @@ paths: "403": $ref: ../responses/avatars/AvatarNotTaggedAsFallbackError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/users/{userId}/avatar": parameters: - $ref: ../parameters.yaml#/userId diff --git a/openapi/components/paths/calendar.yaml b/openapi/components/paths/calendar.yaml index e4e83aa4..79a8af6e 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -159,7 +159,8 @@ paths: get: operationId: getGroupNextCalendarEvent summary: Get next calendar event - description: Get the closest future calendar event scheduled for a group + description: Return the closest future calendar event scheduled for a group. + A group with no future scheduled events answers 404. tags: - calendar parameters: @@ -172,7 +173,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/calendar/CalendarEventNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/calendar/{groupId}/{calendarId}": delete: operationId: deleteGroupCalendarEvent @@ -191,7 +192,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/calendar/CalendarEventNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml get: operationId: getGroupCalendarEvent summary: Get a calendar event @@ -224,7 +225,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/calendar/CalendarEventNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/calendar/{groupId}/{calendarId}/event": parameters: - $ref: ../parameters.yaml#/groupId diff --git a/openapi/components/paths/economy.yaml b/openapi/components/paths/economy.yaml index afdbb3b6..d78e7aa0 100644 --- a/openapi/components/paths/economy.yaml +++ b/openapi/components/paths/economy.yaml @@ -218,10 +218,7 @@ paths: operationId: getSellerEligibility deprecated: true summary: Get Seller Eligibility - description: |- - ~~Get the eligibility of the currently authenticated user to become a seller~~ - - **DEPRECATED:** the route no longer exists. + description: Return the current user's eligibility to become a seller. tags: - deprecated - economy @@ -279,8 +276,7 @@ paths: get: operationId: listStores summary: List Stores - description: Lists stores, optionally filtered to a seller and adjusted for - management views. + description: List a seller's stores, adjusted for management views. tags: - economy security: @@ -288,6 +284,8 @@ paths: responses: "200": $ref: ../responses/economy/StoreListResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "403": @@ -458,13 +456,13 @@ paths: - economy parameters: - name: gifts - description: Return the giftable subscriptions instead of the standard ones. + description: Return giftable subscriptions instead of standard ones. required: false in: query schema: type: boolean - name: recurring - description: Return the recurring subscriptions instead of the standard ones. + description: Return recurring subscriptions instead of standard ones. required: false in: query schema: @@ -481,10 +479,7 @@ paths: operationId: getTiliaStatus deprecated: true summary: Get Tilia Status - description: |- - ~~Gets the status of Tilia integration~~ - - **DEPRECATED:** the route no longer exists. + description: Return the Tilia integration status. tags: - deprecated - economy @@ -547,7 +542,7 @@ paths: get: operationId: getBalance summary: Get Balance - description: Gets the balance of a user. + description: Return the balance of a user. tags: - economy security: @@ -564,10 +559,7 @@ paths: operationId: getBalanceEarnings deprecated: true summary: Get Balance Earnings - description: |- - ~~Gets the balance of a user from earnings~~ - - **DEPRECATED:** the route no longer exists. + description: Return the user's balance from earnings. tags: - deprecated - economy @@ -736,10 +728,7 @@ paths: operationId: getTiliaTos deprecated: true summary: Get Tilia TOS Agreement Status - description: |- - ~~Gets the status of the agreement of a user to the Tilia TOS~~ - - **DEPRECATED:** the route no longer exists. + description: Return the user's Tilia TOS agreement status. tags: - deprecated - economy @@ -756,10 +745,7 @@ paths: operationId: updateTiliaTos deprecated: true summary: Update Tilia TOS Agreement Status - description: |- - ~~Updates the status of the agreement of a user to the Tilia TOS~~ - - **DEPRECATED:** the route no longer exists. + description: Update the user's Tilia TOS agreement status. tags: - deprecated - economy @@ -785,10 +771,7 @@ paths: operationId: getUserCreditsEligible deprecated: true summary: Get User Credits Eligibility - description: |- - ~~Get the user's eligibility status for subscriptions based on available credits.~~ - - **DEPRECATED:** the route no longer exists. + description: Return the user's subscription credit eligibility. tags: - deprecated - economy diff --git a/openapi/components/paths/favorites.yaml b/openapi/components/paths/favorites.yaml index 70a02b43..e1f19f02 100644 --- a/openapi/components/paths/favorites.yaml +++ b/openapi/components/paths/favorites.yaml @@ -76,7 +76,7 @@ paths: - $ref: ../parameters.yaml#/favoriteGroupTypeQuery - $ref: ../parameters.yaml#/userIdAdmin - name: ownerId - description: The owner whose favorite groups to return. Must be a UserID. + description: The user whose favorite groups to return. Must be a user ID. in: query schema: type: string @@ -168,7 +168,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/favorites/FavoriteNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/files.yaml b/openapi/components/paths/files.yaml index 33df30ae..d7c95316 100644 --- a/openapi/components/paths/files.yaml +++ b/openapi/components/paths/files.yaml @@ -89,7 +89,7 @@ paths: "202": $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/analysis/{fileId}/{versionId}/security": parameters: - $ref: ../parameters.yaml#/fileId @@ -108,7 +108,7 @@ paths: "202": $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/analysis/{fileId}/{versionId}/standard": parameters: - $ref: ../parameters.yaml#/fileId @@ -127,7 +127,7 @@ paths: "202": $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml /file: post: operationId: createFile @@ -203,7 +203,7 @@ paths: "200": $ref: ../responses/files/FileResponse.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: createFileVersion summary: Create File Version @@ -232,7 +232,7 @@ paths: "200": $ref: ../responses/files/FileResponse.yaml "404": - $ref: ../responses/files/FileDeletedError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/file/{fileId}/{versionId}": parameters: - $ref: ../parameters.yaml#/fileId @@ -254,7 +254,7 @@ paths: "200": $ref: ../responses/files/RawFileResponse.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteFileVersion summary: Delete File Version diff --git a/openapi/components/paths/friends.yaml b/openapi/components/paths/friends.yaml index 96a2b440..e6ba7d2c 100644 --- a/openapi/components/paths/friends.yaml +++ b/openapi/components/paths/friends.yaml @@ -59,7 +59,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/friends/UserDoesntExistError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteFriendRequest summary: Delete Friend Request @@ -116,7 +116,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/friends/UserDoesntExistError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/groups.yaml b/openapi/components/paths/groups.yaml index a3b600d0..2ba6e9d2 100644 --- a/openapi/components/paths/groups.yaml +++ b/openapi/components/paths/groups.yaml @@ -22,7 +22,7 @@ paths: "200": $ref: ../responses/groups/GroupGalleryFileOrderResponse.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml /groups: get: operationId: searchGroups @@ -101,7 +101,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateGroup summary: Update Group @@ -123,7 +123,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteGroup summary: Delete Group @@ -144,7 +144,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/announcement": parameters: - $ref: ../parameters.yaml#/groupId @@ -167,7 +167,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: createGroupAnnouncement summary: Create Group Announcement @@ -190,7 +190,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteGroupAnnouncement summary: Delete Group Announcement @@ -207,7 +207,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/auditLogTypes": parameters: - $ref: ../parameters.yaml#/groupId @@ -227,7 +227,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/auditLogs": parameters: - $ref: ../parameters.yaml#/groupId @@ -255,7 +255,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/bans": parameters: - $ref: ../parameters.yaml#/groupId @@ -278,7 +278,7 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: banGroupMember summary: Ban Group Member @@ -303,7 +303,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/bans/{userId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -324,7 +324,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/block": parameters: - $ref: ../parameters.yaml#/groupId @@ -346,7 +346,7 @@ paths: "403": $ref: ../responses/groups/GroupAlreadyBlockedError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/galleries": parameters: - $ref: ../parameters.yaml#/groupId @@ -372,7 +372,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/galleries/{groupGalleryId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -400,7 +400,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateGroupGallery summary: Update Group Gallery @@ -422,7 +422,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteGroupGallery summary: Delete Group Gallery @@ -439,7 +439,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/galleries/{groupGalleryId}/images": parameters: - $ref: ../parameters.yaml#/groupId @@ -466,7 +466,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/galleries/{groupGalleryId}/images/{groupGalleryImageId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -489,7 +489,7 @@ paths: # '401': # $ref: ../responses/MissingCredentialsError.yaml # '404': - # $ref: ../responses/groups/GroupNotFoundError.yaml + # $ref: ../responses/ResourceNotFoundError.yaml # security: # - authCookie: [] delete: @@ -508,7 +508,7 @@ paths: "403": $ref: ../responses/groups/GroupGalleryImageDeleteForbiddenError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/instances": parameters: - $ref: ../parameters.yaml#/groupId @@ -528,7 +528,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/invites": parameters: - $ref: ../parameters.yaml#/groupId @@ -551,7 +551,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: declineGroupInvite summary: Decline Invite from Group @@ -574,7 +574,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: createGroupInvite summary: Invite User to Group @@ -599,7 +599,7 @@ paths: "403": $ref: ../responses/groups/GroupInviteForbiddenError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/invites/{userId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -651,7 +651,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/leave": parameters: - $ref: ../parameters.yaml#/groupId @@ -669,7 +669,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/members": parameters: - $ref: ../parameters.yaml#/groupId @@ -696,7 +696,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/members/search": parameters: - $ref: ../parameters.yaml#/groupId @@ -726,7 +726,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/members/{userId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -747,7 +747,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateGroupMember summary: Update Group Member @@ -769,7 +769,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: kickGroupMember summary: Kick Group Member @@ -786,7 +786,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/members/{userId}/roles/{groupRoleId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -808,7 +808,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: removeGroupMemberRole summary: Remove Role from GroupMember @@ -825,7 +825,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/permissions": parameters: - $ref: ../parameters.yaml#/groupId @@ -847,7 +847,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/posts": parameters: - $ref: ../parameters.yaml#/groupId @@ -995,7 +995,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: cancelGroupRequest summary: Cancel Group Join Request @@ -1012,7 +1012,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/requests/{userId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -1039,7 +1039,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/roles": parameters: - $ref: ../parameters.yaml#/groupId @@ -1059,7 +1059,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: createGroupRole summary: Create GroupRole @@ -1082,7 +1082,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/groups/{groupId}/roles/{groupRoleId}": parameters: - $ref: ../parameters.yaml#/groupId @@ -1148,7 +1148,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: initiateOrAcceptGroupTransfer summary: Initiate or Accept Group Transfer @@ -1171,7 +1171,7 @@ paths: "403": $ref: ../responses/groups/GroupTransferInvalidError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: cancelGroupTransfer summary: Cancel Group Transfer @@ -1190,7 +1190,7 @@ paths: "403": $ref: ../responses/groups/GroupNotMemberError.yaml "404": - $ref: ../responses/groups/GroupNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: responses: {} securitySchemes: diff --git a/openapi/components/paths/instances.yaml b/openapi/components/paths/instances.yaml index 040cee4a..f57b91f6 100644 --- a/openapi/components/paths/instances.yaml +++ b/openapi/components/paths/instances.yaml @@ -23,7 +23,7 @@ paths: "200": $ref: ../responses/instances/InstanceResponse.yaml "400": - $ref: ../responses/instances/InstanceBadRequestError.yaml + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml /instances/recent: @@ -66,7 +66,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/instances/InstanceNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/instances/{worldId}:{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId @@ -122,7 +122,7 @@ paths: "403": $ref: ../responses/instances/InstanceCloseForbiddenError.yaml "404": - $ref: ../responses/instances/InstanceNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/instances/{worldId}:{instanceId}/shortName": parameters: - $ref: ../parameters.yaml#/worldId diff --git a/openapi/components/paths/invite.yaml b/openapi/components/paths/invite.yaml index c6800b97..5b590376 100644 --- a/openapi/components/paths/invite.yaml +++ b/openapi/components/paths/invite.yaml @@ -22,7 +22,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/instances/InstanceNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/invite/{notificationId}/response": parameters: - $ref: ../parameters.yaml#/notificationId diff --git a/openapi/components/paths/jams.yaml b/openapi/components/paths/jams.yaml index 06885576..3ad1f883 100644 --- a/openapi/components/paths/jams.yaml +++ b/openapi/components/paths/jams.yaml @@ -44,7 +44,7 @@ paths: "200": $ref: ../responses/jams/JamResponse.yaml "404": - $ref: ../responses/jams/JamNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/jams/{jamId}/submissions": parameters: - $ref: ../parameters.yaml#/jamId @@ -63,7 +63,7 @@ paths: "200": $ref: ../responses/jams/JamSubmissionListResponse.yaml "404": - $ref: ../responses/jams/JamNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: submitJamContent summary: Submit Jam Content @@ -85,7 +85,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/jams/JamNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/jams/{jamId}/submissions/{jamSubmissionId}": parameters: - $ref: ../parameters.yaml#/jamId @@ -106,4 +106,4 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/jams/JamNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml diff --git a/openapi/components/paths/miscellaneous.yaml b/openapi/components/paths/miscellaneous.yaml index 547f524f..76ecb12f 100644 --- a/openapi/components/paths/miscellaneous.yaml +++ b/openapi/components/paths/miscellaneous.yaml @@ -58,9 +58,9 @@ paths: deprecated: true summary: Check API Health description: |- - ~~Gets the overall health status, the server name, and the current build version tag of the API.~~ + Gets the overall health status, the server name, and the current build version tag of the API. - **DEPRECATED:** VRChat has suddenly restricted this endpoint for unknown reasons, and now always return 401 Unauthorized. + VRChat has restricted this endpoint, which now always returns 401 Unauthorized. tags: - miscellaneous security: [] @@ -90,7 +90,7 @@ paths: "200": $ref: ../responses/system/InfoPushListResponse.yaml "400": - $ref: ../responses/system/InfoPushBadRequestError.yaml + $ref: ../responses/RequestValidationError.yaml x-badges: - color: gold label: "Status: Early Access (Still Under Development)" diff --git a/openapi/components/paths/notifications.yaml b/openapi/components/paths/notifications.yaml index 7b911ff9..a45472eb 100644 --- a/openapi/components/paths/notifications.yaml +++ b/openapi/components/paths/notifications.yaml @@ -76,7 +76,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/auth/user/notifications/{notificationId}/accept": parameters: - $ref: ../parameters.yaml#/notificationId @@ -176,7 +176,7 @@ paths: "403": $ref: ../responses/InvalidAdminCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteNotificationV2 summary: Delete NotificationV2 @@ -193,7 +193,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/notifications/{notificationId}/reply": parameters: - $ref: ../parameters.yaml#/notificationId @@ -219,7 +219,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/notifications/{notificationId}/respond": parameters: - $ref: ../parameters.yaml#/notificationId @@ -245,7 +245,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/notifications/{notificationId}/see": parameters: - $ref: ../parameters.yaml#/notificationId @@ -263,7 +263,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index 24082308..2c86ec23 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -62,7 +62,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateProp summary: Update Prop @@ -90,7 +90,7 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteProp summary: Delete Prop @@ -107,7 +107,7 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/props/{propId}/publish": parameters: - $ref: ../parameters.yaml#/propId @@ -115,10 +115,7 @@ paths: operationId: getPropPublishStatus deprecated: true summary: Get Prop Publish Status - description: |- - ~~Returns a PropPublishStatus object.~~ - - **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. + description: Return the PropPublishStatus object. `/props/{propId}` is still served. tags: - deprecated - props @@ -137,10 +134,7 @@ paths: operationId: publishProp deprecated: true summary: Publish Prop - description: |- - ~~Publish a Prop and return the updated PropPublishStatus object.~~ - - **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. + description: Publish a prop and return the updated PropPublishStatus object. `/props/{propId}` is still served. tags: - deprecated - props @@ -159,10 +153,7 @@ paths: operationId: unpublishProp deprecated: true summary: Unpublish Prop - description: |- - ~~Unpublish a Prop and return the updated PropPublishStatus object.~~ - - **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. + description: Unpublish a prop and return the updated PropPublishStatus object. `/props/{propId}` is still served. tags: - deprecated - props diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index 91e07c36..1cb6f72d 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -163,7 +163,7 @@ paths: "403": $ref: ../responses/InvalidAdminCredentialsError.yaml "404": - $ref: ../responses/users/UserNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/users/{userId}": parameters: - $ref: ../parameters.yaml#/userId @@ -181,7 +181,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/users/UserNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateUser summary: Update User Info @@ -594,10 +594,10 @@ paths: deprecated: true summary: Get User by Username description: |- - ~~Get public user information about a specific user using their name.~~ + Get public user information about a specific user using their name. - **DEPRECATED:** VRChat API no longer return usernames of other users. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). - This endpoint now require Admin Credentials. + VRChat no longer returns the usernames of other users, and this endpoint + now requires admin credentials. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). tags: - users security: diff --git a/openapi/components/paths/worlds.yaml b/openapi/components/paths/worlds.yaml index 1b803162..ac46011b 100644 --- a/openapi/components/paths/worlds.yaml +++ b/openapi/components/paths/worlds.yaml @@ -168,7 +168,7 @@ paths: "200": $ref: ../responses/worlds/WorldResponse.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateWorld summary: Update World @@ -190,7 +190,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteWorld summary: Delete World @@ -207,7 +207,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/addTags": parameters: - $ref: ../parameters.yaml#/worldId @@ -239,7 +239,7 @@ paths: operationId: removeWorldTags summary: Remove World Tags description: |- - Removes tags from the world's profile. + Remove tags from the world's profile. The path is `deleteTags`, not `removeTags` as the user equivalent uses. tags: @@ -277,7 +277,7 @@ paths: "200": $ref: ../responses/worlds/WorldMetadataResponse.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/platform/{publishedPlatform}": parameters: - $ref: ../parameters.yaml#/worldId @@ -296,7 +296,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/publish": parameters: - $ref: ../parameters.yaml#/worldId @@ -314,7 +314,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: publishWorld summary: Publish World @@ -329,7 +329,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: unpublishWorld summary: Unpublish World @@ -344,7 +344,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId diff --git a/openapi/components/tags.yaml b/openapi/components/tags.yaml index 3407cc4d..8e9b19d7 100644 --- a/openapi/components/tags.yaml +++ b/openapi/components/tags.yaml @@ -57,6 +57,6 @@ $ref: ./paths/worlds.yaml#/info/description - name: deprecated description: >- - Routes VRChat no longer serves: every observed call answers the generic - "not implemented" 404. They stay described, and the conformance suite keeps - calling them, so a route that comes back shows up. + Routes VRChat no longer serves: every call answers the generic "not + implemented" 404. They stay described, and the conformance suite keeps + calling them, so a route that comes back online shows up. From 923e8510c3ca98ffa3e4050941f529b446031b59 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:26:02 -0400 Subject: [PATCH 08/17] fix(openapi): correct schemas against captured traffic --- openapi/components/schemas/APIConfig.yaml | 2 +- openapi/components/schemas/CurrentUser.yaml | 6 ++---- openapi/components/schemas/Notification.yaml | 5 ++--- openapi/components/schemas/RouteNotImplemented.yaml | 10 ++++++---- openapi/components/schemas/SentNotification.yaml | 4 +--- openapi/components/schemas/User.yaml | 7 ------- 6 files changed, 12 insertions(+), 22 deletions(-) diff --git a/openapi/components/schemas/APIConfig.yaml b/openapi/components/schemas/APIConfig.yaml index 6160e2ea..991bee48 100644 --- a/openapi/components/schemas/APIConfig.yaml +++ b/openapi/components/schemas/APIConfig.yaml @@ -1,7 +1,7 @@ title: APIConfig type: object description: |- - Global configuration for various features. + Global client configuration. The response carries decoy properties: plausible-looking names VRChat rerolls at random as deliberate obfuscation. additionalProperties: true diff --git a/openapi/components/schemas/CurrentUser.yaml b/openapi/components/schemas/CurrentUser.yaml index 126d1d78..8527effa 100644 --- a/openapi/components/schemas/CurrentUser.yaml +++ b/openapi/components/schemas/CurrentUser.yaml @@ -270,11 +270,9 @@ properties: type: string nullable: true username: - deprecated: true type: string - description: -| **DEPRECATED:** VRChat API no longer return usernames of other - users. [See issue by Tupper for more - information](https://github.com/pypy-vrc/VRCX/issues/429). + description: Your own unique name, used during login. Distinct from + `displayName`, and never returned for another user. usesGeneratedPassword: type: boolean viveId: diff --git a/openapi/components/schemas/Notification.yaml b/openapi/components/schemas/Notification.yaml index 96aed8d5..4637ed91 100644 --- a/openapi/components/schemas/Notification.yaml +++ b/openapi/components/schemas/Notification.yaml @@ -27,10 +27,9 @@ properties: senderUserId: $ref: ./UserID.yaml senderUsername: - deprecated: true type: string - description: -| - **DEPRECATED:** VRChat API no longer return usernames of other users. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). + description: The name of the user who sent the notification. + nullable: true minLength: 1 type: $ref: ./NotificationType.yaml diff --git a/openapi/components/schemas/RouteNotImplemented.yaml b/openapi/components/schemas/RouteNotImplemented.yaml index 466c7eee..43f8af9b 100644 --- a/openapi/components/schemas/RouteNotImplemented.yaml +++ b/openapi/components/schemas/RouteNotImplemented.yaml @@ -1,16 +1,18 @@ title: RouteNotImplemented type: object description: >- - The body VRChat returns for a route it does not serve. Note the shape differs - from every other error in this description: `error` is a string here, not an + The body VRChat returns for a route it does not serve. The shape differs from + every other error in this description: `error` is a string here, not an `Error` object with `message` and `status_code` inside it. properties: error: type: string - example: The endpoint you're looking for is not implemented by our system. + enum: + - The endpoint you're looking for is not implemented by our system. status_code: type: integer - example: 404 + enum: + - 404 required: - error - status_code diff --git a/openapi/components/schemas/SentNotification.yaml b/openapi/components/schemas/SentNotification.yaml index 5a78f462..2f660d59 100644 --- a/openapi/components/schemas/SentNotification.yaml +++ b/openapi/components/schemas/SentNotification.yaml @@ -31,10 +31,8 @@ properties: senderUserId: $ref: ./UserID.yaml senderUsername: - deprecated: true type: string - description: -| - **DEPRECATED:** VRChat API no longer return usernames of other users. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). + description: The name of the user who sent the notification. minLength: 1 type: $ref: ./NotificationType.yaml diff --git a/openapi/components/schemas/User.yaml b/openapi/components/schemas/User.yaml index a9268586..e10e67fb 100644 --- a/openapi/components/schemas/User.yaml +++ b/openapi/components/schemas/User.yaml @@ -120,13 +120,6 @@ properties: type: string userIcon: type: string - username: - deprecated: true - type: string - description: -| - A users unique name, used during login. This is different from `displayName` which is what shows up in-game. A users `username` can never be changed.' - - **DEPRECATED:** VRChat API no longer return usernames of other users. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). worldId: $ref: ./WorldID.yaml required: From 6774a2cdb07e935f3a7c6526db8fb3abcc8d9e82 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:43:54 -0400 Subject: [PATCH 09/17] style(openapi): sort InfoPushEmbeddedLink properties --- openapi/components/schemas/InfoPushEmbeddedLink.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openapi/components/schemas/InfoPushEmbeddedLink.yaml b/openapi/components/schemas/InfoPushEmbeddedLink.yaml index 3c465592..f035cde3 100644 --- a/openapi/components/schemas/InfoPushEmbeddedLink.yaml +++ b/openapi/components/schemas/InfoPushEmbeddedLink.yaml @@ -1,13 +1,13 @@ title: InfoPushEmbeddedLink type: object properties: - parameters: - type: array - items: - type: string command: type: string id: type: string name: type: string + parameters: + type: array + items: + type: string From 1e25b1643bc693d48c868748882ed6232185d93c Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:43:58 -0400 Subject: [PATCH 10/17] style(openapi): remove a stray blank line in InventoryMetadata --- openapi/components/schemas/InventoryMetadata.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/openapi/components/schemas/InventoryMetadata.yaml b/openapi/components/schemas/InventoryMetadata.yaml index eca7eab2..83728cd3 100644 --- a/openapi/components/schemas/InventoryMetadata.yaml +++ b/openapi/components/schemas/InventoryMetadata.yaml @@ -20,6 +20,5 @@ properties: type: string propId: $ref: ./PropID.yaml - propKind: type: integer From 17dd7dd1e4d1803eee2c001c5ab490ac207bfc2e Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:46:19 -0400 Subject: [PATCH 11/17] Revert "style(openapi): sort InfoPushEmbeddedLink properties" This reverts commit d7998f86aafe1edd00ea20d6f790cfff67a5cd03. --- openapi/components/schemas/InfoPushEmbeddedLink.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openapi/components/schemas/InfoPushEmbeddedLink.yaml b/openapi/components/schemas/InfoPushEmbeddedLink.yaml index f035cde3..3c465592 100644 --- a/openapi/components/schemas/InfoPushEmbeddedLink.yaml +++ b/openapi/components/schemas/InfoPushEmbeddedLink.yaml @@ -1,13 +1,13 @@ title: InfoPushEmbeddedLink type: object properties: + parameters: + type: array + items: + type: string command: type: string id: type: string name: type: string - parameters: - type: array - items: - type: string From 82a6e4e1f347959112f939987cc75aff5d61f483 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:23:08 -0400 Subject: [PATCH 12/17] test: add arazzo conformance suite driven by respect --- .gitignore | 11 +- CLAUDE.md | 122 + package.json | 31 +- pnpm-lock.yaml | 2573 ++--------- redocly.yaml | 14 + redocly/plugin.ts | 45 + test/.env.example | 15 + test/arazzo.yaml | 10730 ++++++++++++++++++++++++++++++++++++++++++++ test/run.sh | 80 + 9 files changed, 11398 insertions(+), 2223 deletions(-) create mode 100644 CLAUDE.md create mode 100644 test/.env.example create mode 100644 test/arazzo.yaml create mode 100755 test/run.sh diff --git a/.gitignore b/.gitignore index 00019a05..b75dfe62 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,13 @@ **/node_modules dist .idea -.claude \ No newline at end of file +.claude +test/.out +.env +.env.* +!.env.example + +# Captures of authenticated traffic contain the session cookie in plaintext: +# Respect masks inputs marked `format: password`, but not values captured from a +# response into a step output. +*.har \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..84eb5ad6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,122 @@ +# VRChat API specification + +VRChat publishes no specification. Every path, field, type, and example here is +reverse-engineered from live traffic, so a confident sentence nobody checked is +the failure this repo produces most. + +`test/arazzo.yaml` drives ~500 workflows against the live API and writes the +capture to `test/.out/har/arazzo.har`. That capture is the evidence. Query it +before writing anything: + +```sh +jq -r '[.log.entries[] | select(.request.url | contains("/users/")) | .response.content.text | fromjson] | .[0]' test/.out/har/arazzo.har +``` + +## Never document what the traffic has not shown + +- Every property, type, enum value, `required` entry, and example comes from a + captured response. Never add one from a field name, a sibling schema, or the + client's behaviour. +- A field that is always `null` establishes nothing about its type. Write `{}` + rather than guessing from the name. Never write a bare `nullable: true`: Ajv + rejects it without a `type`, and the schema check fails. +- `nullable: true` means JSON `null` was captured. A field that is sometimes + absent is not nullable. +- Close an `enum` only when the set is known. Two observed values do not make a + set; a generated client will reject the third. +- `/config` returns decoy properties, plausible-looking names VRChat rerolls at + random. Never document one, and keep `APIConfig` `additionalProperties: true`. + +## Absent from one capture is not absent + +Adding needs evidence; removing needs far more. A capture records one account in +one state, and a response changes shape with that state — `presence` carries +nine keys for an offline account and nineteen for an online one. + +A property missing from a capture is a coverage gap, not a phantom. Add the +workflow that reaches the state carrying it, and judge the property once that +workflow has run. Deleting on the strength of one capture removes what the +suite merely failed to reach. + +## An unevidenced schema is a missing test + +`{}`, a value only ever `null`, and a property no response has carried all mean +the same thing: no workflow reaches the case that would settle it. Add the +workflow to `test/arazzo.yaml`; never close the gap by guessing. + +`required` cuts both ways. A property every observed response carries but that +`required` omits is either required, or missing the workflow that shows it +absent. A property in `required` that some response omits is neither. + +## One operation per workflow + +A failing step ends its workflow, so every operation after it goes unexercised +and its coverage disappears without saying so. Give each operation its own +workflow. Chain steps only where a later one needs state an earlier one created: +a create-read-delete lifecycle belongs together, a run of independent reads does +not. + +## Descriptions state what the API does + +- Never write about the evidence. No "observed", "unverified", "appears to", + "not established", "no other value seen". +- Never assert what the wire cannot show: lifetimes, units, defaults, causes, + what the client does with a value. +- State a rule once. Where a response component explains a status code, the + operations returning it stay silent. + +## Examples are copied, never typed + +Copy the body from the capture verbatim. VRChat substitutes lookalike +characters in validation messages — `˸` (U+02F8) for a colon, `‚` (U+201A) for a +comma, `․` (U+2024) for a full stop — and a retyped example normalises them, +which is how you can tell nobody captured it. + +## Deprecation + +Mark `deprecated: true` only where every observed call answers the generic +"not implemented" 404. Keep the original tag and add `deprecated`, so the suite +keeps calling the route and a revival shows up. + +## Comments + +Never add a YAML comment. A fact about the API belongs in a `description`. + +## Traps + +- `respect` closes any schema that omits `additionalProperties`, so a genuinely + open one must say `additionalProperties: true`. The `vrchat/close-schemas` + decorator changes `drift` only, and does not reach the schema check. +- `respect` masks secrets in the capture and sends the real value. `********` in + a HAR is evidence about nothing. +- `dist/openapi-test.yaml` defines `jsonschema` and `internal`, so `x-if` takes + its `then` branch. The published bundles take `else`. Both must describe the + same traffic; check which one you are validating against before believing a + finding. +- `drift`'s `security-baseline` flags every unauthenticated workflow for the + missing cookie it exists to assert. Every finding it produces is a 401 and + none is actionable. +- A `oneOf` that matches no branch reports every property in the body as + unevaluated, so one missing property produces hundreds of findings naming + innocent ones. Fix the branch that should have matched, never the properties + the finding names. +- `respect` rejects `--skip` alongside `--workflow`, and runs only what you name, + so an authenticated workflow needs `-w session` too. +- A `-w` run writes `test/.out/partial.har` and leaves the suite capture alone. + `coverage` and `drift` read the suite capture, so run them after a full run. +- Some files under `openapi/components/paths/` are CRLF. Read a diff of one with + `git diff --ignore-all-space` before believing its size. + +## Commands + +| | | +| --- | --- | +| `pnpm bundle` | build `dist/` | +| `pnpm lint` | spectral, eslint, arazzo | +| `pnpm test` | drive the suite against the live API | +| `pnpm test -w session -w ` | one workflow, plus the session it reads | +| `pnpm test:coverage` | what the traffic never reached | +| `pnpm test:drift` | where traffic and description disagree | + +`pnpm test` reuses the cached session in `test/.out/`; delete +`test/.out/session` to force a fresh login. diff --git a/package.json b/package.json index d4508a45..a63ac0ab 100644 --- a/package.json +++ b/package.json @@ -4,41 +4,38 @@ "version": "1.0.0", "private": true, "description": "VRChat API OpenAPI Specification", - "author": "", "license": "MIT", - "main": "index.js", "scripts": { - "lint-spectral": "bun spectral openapi/openapi.yaml", - "lint-spectral-ci": "bun spectral -i openapi/openapi.yaml", - "lint-eslint": "eslint .", - "lint-eslint-ci": "pnpm -s run lint-eslint -f @jamesacarr/eslint-formatter-github-actions", - "lint": "pnpm --no-bail --stream --reporter-hide-prefix --color run '/^lint-(?!ci$)(?!.*-ci$).*/'", - "lint-ci": "pnpm --stream --reporter-hide-prefix run '/^lint-.*-ci$/'", - "bundle": "redocly bundle" + "bundle": "redocly bundle", + "lint": "pnpm --no-bail --stream --reporter-hide-prefix --color run '/^lint:/'", + "lint-ci": "pnpm --stream --reporter-hide-prefix run '/^lint:/'", + "lint:spectral": "bun spectral openapi/openapi.yaml", + "lint:eslint": "eslint . ${CI:+-f @jamesacarr/eslint-formatter-github-actions}", + "lint:arazzo": "redocly lint test/arazzo.yaml", + "test": "sh test/run.sh", + "test:coverage": "redocly coverage test/.out/har --api dist/openapi-internal.json", + "test:drift": "redocly drift test/.out/har --api dist/openapi-test.yaml" }, "devDependencies": { "@actions/core": "^1.11.1", - "@apidevtools/json-schema-ref-parser": "^15.1.2", "@ariesclark/eslint-config": "^3.1.1", - "@eslint-react/eslint-plugin": "^2.3.9", "@jamesacarr/eslint-formatter-github-actions": "^0.2.0", - "@redocly/cli": "^2.12.0", - "@redocly/openapi-core": "^2.12.5", - "@stoplight/spectral-cli": "^6.15.0", + "@redocly/cli": "link:../redocly-cli/packages/cli", + "@redocly/openapi-core": "^2.41.2", "@stoplight/spectral-core": "^1.20.0", "@stoplight/spectral-formats": "^1.8.2", "@stoplight/spectral-formatters": "^1.5.0", - "@stoplight/spectral-functions": "^1.10.1", "@stoplight/spectral-parsers": "^1.0.5", "@stoplight/spectral-rulesets": "^1.22.0", "@types/bun": "^1.3.3", "@types/node": "^24.10.1", "@types/pluralize": "^0.0.33", "change-case": "^5.4.4", - "cspell": "^9.3.2", "cspell-lib": "^9.3.2", "eslint": "^9.39.1", + "httpexec": "^0.0.2", "pluralize": "^8.0.0", - "semver": "^7.7.3" + "semver": "^7.7.3", + "totp-generator": "^2.0.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd6d036e..029d2e77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,27 +11,18 @@ importers: '@actions/core': specifier: ^1.11.1 version: 1.11.1 - '@apidevtools/json-schema-ref-parser': - specifier: ^15.1.2 - version: 15.1.2(@types/json-schema@7.0.15) '@ariesclark/eslint-config': specifier: ^3.1.1 - version: 3.1.1(@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.2) - '@eslint-react/eslint-plugin': - specifier: ^2.3.9 - version: 2.3.9(eslint@9.39.1)(typescript@5.9.3) + version: 3.1.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2) '@jamesacarr/eslint-formatter-github-actions': specifier: ^0.2.0 version: 0.2.0 '@redocly/cli': - specifier: ^2.12.0 - version: 2.12.0(@opentelemetry/api@1.9.0)(ajv@8.17.1)(core-js@3.47.0) + specifier: link:../redocly-cli/packages/cli + version: link:../redocly-cli/packages/cli '@redocly/openapi-core': - specifier: ^2.12.5 - version: 2.12.5(ajv@8.17.1) - '@stoplight/spectral-cli': - specifier: ^6.15.0 - version: 6.15.0 + specifier: ^2.41.2 + version: 2.41.2 '@stoplight/spectral-core': specifier: ^1.20.0 version: 1.20.0 @@ -41,9 +32,6 @@ importers: '@stoplight/spectral-formatters': specifier: ^1.5.0 version: 1.5.0 - '@stoplight/spectral-functions': - specifier: ^1.10.1 - version: 1.10.1 '@stoplight/spectral-parsers': specifier: ^1.0.5 version: 1.0.5 @@ -62,21 +50,24 @@ importers: change-case: specifier: ^5.4.4 version: 5.4.4 - cspell: - specifier: ^9.3.2 - version: 9.3.2 cspell-lib: specifier: ^9.3.2 version: 9.3.2 eslint: specifier: ^9.39.1 version: 9.39.1 + httpexec: + specifier: ^0.0.2 + version: 0.0.2 pluralize: specifier: ^8.0.0 version: 8.0.0 semver: specifier: ^7.7.3 version: 7.7.3 + totp-generator: + specifier: ^2.0.1 + version: 2.0.1 packages: @@ -144,12 +135,6 @@ packages: '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} - '@apidevtools/json-schema-ref-parser@15.1.2': - resolution: {integrity: sha512-54vnqDyGsDAVM0LOIdGMnfVyCN1NlqoGnHEGpMfaDBLMvClfT4j2XbJgvfuF0Ca0kxT6Gb7xUgS5W1I14QqjiQ==} - engines: {node: '>=20'} - peerDependencies: - '@types/json-schema': ^7.0.15 - '@ariesclark/eslint-config@3.1.1': resolution: {integrity: sha512-9bmdqwS+3Vwxkz27xaSyg0BKpcAHkq7SiueY2eA7QG+xRG/YmxdELBlY9WhoE1EHCi2q7TheMBGZqvXZgk/yiA==} peerDependencies: @@ -200,10 +185,6 @@ packages: resolution: {integrity: sha512-OmKzq/0FATHU671GKMzBrTyLdm25Wnziva7h4ylumVn1wnwWsXGef5bgXD7iuApqfqH9SzxsU0NtTB8m8vwEHQ==} engines: {node: '>=20'} - '@cspell/cspell-json-reporter@9.3.2': - resolution: {integrity: sha512-YRgpeHN9uY8kUlIw9q+8zJ0tRTAJMbfBTGzCq9Puah09NeMWlRMFPUkXVrkdic6NA7etboZ+zEdoZwRO9EmhiA==} - engines: {node: '>=20'} - '@cspell/cspell-pipe@9.3.2': resolution: {integrity: sha512-REF7ibG79WLEynIMUss/IRDCdYEb1nlE1rj/gt2CbPFzLa6t5MRwW2lajEvXS6/WgbMtsTVHAWi3ALqJzCwxng==} engines: {node: '>=20'} @@ -427,15 +408,6 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emotion/is-prop-valid@1.2.2': - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - - '@emotion/memoize@0.8.1': - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - - '@emotion/unitless@0.8.1': - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - '@es-joy/jsdoccomment@0.50.2': resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} @@ -768,45 +740,6 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.3.9': - resolution: {integrity: sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/core@2.3.9': - resolution: {integrity: sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/eff@2.3.9': - resolution: {integrity: sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==} - engines: {node: '>=20.19.0'} - - '@eslint-react/eslint-plugin@2.3.9': - resolution: {integrity: sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/shared@2.3.9': - resolution: {integrity: sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/var@2.3.9': - resolution: {integrity: sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@eslint/compat@1.4.1': resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -860,13 +793,6 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@exodus/schemasafe@1.3.0': - resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} - - '@faker-js/faker@7.6.0': - resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} - engines: {node: '>=14.0.0', npm: '>=6.0.0'} - '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -883,10 +809,6 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/momoa@2.0.4': - resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} - engines: {node: '>=10.10.0'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -899,10 +821,6 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jamesacarr/eslint-formatter-github-actions@0.2.0': resolution: {integrity: sha512-/BMX+d6Pg36aHi7FmRsyCXUXCFQOVnJap1xl97kgglNE++d2HtqR6eHVxL56wXnXqC5wyI4T9Y3e2RccyubqQA==} @@ -940,176 +858,23 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@opentelemetry/api-logs@0.202.0': - resolution: {integrity: sha512-fTBjMqKCfotFWfLzaKyhjLvyEyq5vDKTTFfBmx21btv3gvy8Lq6N5Dh2OzqeuN4DjtpSvNT1uNVfg08eD2Rfxw==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/context-async-hooks@2.0.1': - resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.0.1': - resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/exporter-trace-otlp-http@0.202.0': - resolution: {integrity: sha512-/hKE8DaFCJuaQqE1IxpgkcjOolUIwgi3TgHElPVKGdGRBSmJMTmN/cr6vWa55pCJIXPyhKvcMrbrya7DZ3VmzA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-exporter-base@0.202.0': - resolution: {integrity: sha512-nMEOzel+pUFYuBJg2znGmHJWbmvMbdX5/RhoKNKowguMbURhz0fwik5tUKplLcUtl8wKPL1y9zPnPxeBn65N0Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.202.0': - resolution: {integrity: sha512-5XO77QFzs9WkexvJQL9ksxL8oVFb/dfi9NWQSq7Sv0Efr9x3N+nb1iklP1TeVgxqJ7m1xWiC/Uv3wupiQGevMw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/resources@2.0.1': - resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-logs@0.202.0': - resolution: {integrity: sha512-pv8QiQLQzk4X909YKm0lnW4hpuQg4zHwJ4XBd5bZiXcd9urvrJNoNVKnxGHPiDVX/GiLFvr5DMYsDBQbZCypRQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.0.1': - resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.0.1': - resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-node@2.0.1': - resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/semantic-conventions@1.34.0': - resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==} - engines: {node: '>=14'} - '@pkgr/core@0.2.9': resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@protobufjs/aspromise@1.1.2': - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - - '@protobufjs/base64@1.1.2': - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - - '@protobufjs/eventemitter@1.1.0': - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - - '@protobufjs/fetch@1.1.0': - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - - '@protobufjs/float@1.0.2': - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - - '@protobufjs/path@1.1.2': - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - - '@protobufjs/pool@1.1.0': - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - - '@redocly/ajv@8.11.4': - resolution: {integrity: sha512-77MhyFgZ1zGMwtCpqsk532SJEc3IJmSOXKTCeWoMTAvPnQOkuOgxEip1n5pG5YX1IzCTJ4kCvPKr8xYyzWFdhg==} - - '@redocly/ajv@8.17.1': - resolution: {integrity: sha512-EDtsGZS964mf9zAUXAl9Ew16eYbeyAFWhsPr0fX6oaJxgd8rApYlPBf0joyhnUHz88WxrigyFtTaqqzXNzPgqw==} - - '@redocly/cli@2.12.0': - resolution: {integrity: sha512-/q8RnBe+Duo+XYFCG8LnaD0kroGZ8MoS6575Xq59tCgjaCL16F+pZZ75xNBU2oXfEypJClNz/6ilc2G0q1+tlw==} - engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} - hasBin: true - - '@redocly/config@0.22.2': - resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} - - '@redocly/config@0.40.0': - resolution: {integrity: sha512-MZQZs7QEGnue3rVN9Q9QvDbcGjesxbpKXUvDeckS69R1xjtgsnT9B39VA25zmwSJtgUeA9ST+sMf9GxIqixNbw==} + '@redocly/ajv@8.18.1': + resolution: {integrity: sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==} - '@redocly/config@0.41.0': - resolution: {integrity: sha512-8yJ2e+ex8KVF25zijdpDbAEjyubk7NLfHsLI8h0MUnLEo2iEg6rTCDT9Qw71XDqd5UlXvfJb0Z0h6dd+Y6pWLw==} + '@redocly/ajv@8.18.3': + resolution: {integrity: sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==} - '@redocly/openapi-core@1.34.5': - resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} - engines: {node: '>=18.17.0', npm: '>=9.5.0'} - - '@redocly/openapi-core@2.12.0': - resolution: {integrity: sha512-RsVwmRD0KhyJbR8acIeU98ce6N+/YCuLJf6IGN+2SOsbwnDhnI5MG0TFV9D7URK/ukEewaNA701dVYsoP1VtRQ==} - engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} - - '@redocly/openapi-core@2.12.5': - resolution: {integrity: sha512-PlzsfOgPUWg4OmyznsIWQ6EnfZK6KSOn2MG4sZS3DY9cHgno5YywNy8zFQWHADXLqR7hTw2M7VvbiMKVJxzyiA==} - engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} + '@redocly/config@0.52.0': + resolution: {integrity: sha512-e/++L27tRgo35GVCy4ivy+uqHi/ksg4KnhlYzj5FTJ9OokuyX18B0mJm0SUXLBih9VIQMgSk6tXsyYmhg5OsIQ==} - '@redocly/respect-core@2.12.0': - resolution: {integrity: sha512-mrYrfE81shSRS96ygXaRiSithV4Fe4Y7XlSYLSTfM8Lo3YAz7Geirg7HZ5fNFsI+hdW05ZuQewqpKL8XLwaAeA==} + '@redocly/openapi-core@2.41.2': + resolution: {integrity: sha512-qTH6xpEYffhrgJ5e9i1BW9CBi66cDacU9LYFvHuX4MQweunxohwFjVbz159sH7q9mpvqoM1yc1EpB8d7K6Y0wg==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} - '@rollup/plugin-commonjs@22.0.2': - resolution: {integrity: sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==} - engines: {node: '>= 12.0.0'} - peerDependencies: - rollup: ^2.68.0 - - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - '@rollup/rollup-android-arm-eabi@4.53.3': resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] @@ -1246,11 +1011,6 @@ packages: resolution: {integrity: sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==} engines: {node: '>=8'} - '@stoplight/spectral-cli@6.15.0': - resolution: {integrity: sha512-FVeQIuqQQnnLfa8vy+oatTKUve7uU+3SaaAfdjpX/B+uB1NcfkKRJYhKT9wMEehDRaMPL5AKIRYMCFerdEbIpw==} - engines: {node: ^16.20 || ^18.18 || >= 20.17} - hasBin: true - '@stoplight/spectral-core@1.20.0': resolution: {integrity: sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ==} engines: {node: ^16.20 || ^18.18 || >= 20.17} @@ -1275,14 +1035,6 @@ packages: resolution: {integrity: sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==} engines: {node: ^16.20 || ^18.18 || >= 20.17} - '@stoplight/spectral-ruleset-bundler@1.6.3': - resolution: {integrity: sha512-AQFRO6OCKg8SZJUupnr3+OzI1LrMieDTEUHsYgmaRpNiDRPvzImE3bzM1KyQg99q58kTQyZ8kpr7sG8Lp94RRA==} - engines: {node: ^16.20 || ^18.18 || >= 20.17} - - '@stoplight/spectral-ruleset-migrator@1.11.3': - resolution: {integrity: sha512-+9Y1zFxYmSsneT5FPkgS1IlRQs0VgtdMT77f5xf6vzje9ezyhfs7oXwbZOCSZjEJew8iVZBKQtiOFndcBrdtqg==} - engines: {node: ^16.20 || ^18.18 || >= 20.17} - '@stoplight/spectral-rulesets@1.22.0': resolution: {integrity: sha512-l2EY2jiKKLsvnPfGy+pXC0LeGsbJzcQP5G/AojHgf+cwN//VYxW1Wvv4WKFx/CLmLxc42mJYF2juwWofjWYNIQ==} engines: {node: ^16.20 || ^18.18 || >= 20.17} @@ -1303,16 +1055,9 @@ packages: resolution: {integrity: sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==} engines: {node: ^12.20 || >=14.13} - '@stoplight/yaml-ast-parser@0.0.48': - resolution: {integrity: sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==} - '@stoplight/yaml-ast-parser@0.0.50': resolution: {integrity: sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==} - '@stoplight/yaml@4.2.3': - resolution: {integrity: sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==} - engines: {node: '>=10.8'} - '@stoplight/yaml@4.3.0': resolution: {integrity: sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==} engines: {node: '>=10.8'} @@ -1335,9 +1080,6 @@ packages: '@types/es-aggregate-error@1.0.6': resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1365,12 +1107,6 @@ packages: '@types/sarif@2.1.7': resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} - '@types/stylis@4.2.5': - resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1436,6 +1172,126 @@ packages: resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -1573,10 +1429,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -1616,25 +1468,13 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - are-docs-informative@0.0.2: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} @@ -1653,13 +1493,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - - ast-types@0.14.2: - resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} - engines: {node: '>=4'} - astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -1668,9 +1501,6 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1682,19 +1512,6 @@ packages: resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==} hasBin: true - better-ajv-errors@1.2.0: - resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - ajv: 4.11.8 - 8 - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - birecord@0.1.1: - resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1704,10 +1521,6 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - browserslist@4.28.0: resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1717,9 +1530,6 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - bun-types@1.3.3: resolution: {integrity: sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==} @@ -1745,44 +1555,26 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001757: resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk-template@1.1.2: - resolution: {integrity: sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==} - engines: {node: '>=14.16'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1791,9 +1583,6 @@ packages: resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -1809,10 +1598,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1823,17 +1608,6 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1846,12 +1620,6 @@ packages: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - compare-versions@6.1.1: - resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1865,16 +1633,9 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - core-js-compat@3.47.0: resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} - core-js@3.47.0: - resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1890,11 +1651,6 @@ packages: resolution: {integrity: sha512-E3YhOhZzZt1a+AEbFV2B3THCyZ576PDg0mDNUDrU1Y65SyIhf4DC6itfPoAb6R3FI/DI218RqWZg/FTT8lJ2gA==} engines: {node: '>=20'} - cspell-gitignore@9.3.2: - resolution: {integrity: sha512-G2bLR+Dfb9GX4Sdm75GfCCa9V/sQYkRbLckuCuVmJxvcDB0xfczAtb6TfAXIziF3oUI6cOB1g+PoNLWBelcK5w==} - engines: {node: '>=20'} - hasBin: true - cspell-glob@9.3.2: resolution: {integrity: sha512-TuSupENEKyOCupOUZ3vnPxaTOghxY/rD1JIkb8e5kjzRprYVilO/rYqEk/52iLwJVd+4Npe8fNhR3KhU7u/UUg==} engines: {node: '>=20'} @@ -1916,29 +1672,11 @@ packages: resolution: {integrity: sha512-1Af7Mq9jIccFQyJl/ZCcqQbtJwuDqpQVkk8xfs/92x4OI6gW1iTVRMtsrh0RTw1HZoR8aQD7tRRCiLPf/D+UiQ==} engines: {node: '>=20'} - cspell@9.3.2: - resolution: {integrity: sha512-3xFyVSTYrYa/QJzLfzsCRMkMXqOsytP8E26DuGrVMJQoLPFmbOXNNtnMu4wrtr17QVloxpvutW77U4vb2L/LDQ==} - engines: {node: '>=20'} - hasBin: true - - css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - - css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - data-uri-to-buffer@2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1960,9 +1698,6 @@ packages: supports-color: optional: true - decko@1.2.0: - resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} - decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -1977,10 +1712,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} @@ -1996,29 +1727,16 @@ packages: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dompurify@3.3.0: - resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} - - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.260: resolution: {integrity: sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} @@ -2062,9 +1780,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es6-promise@3.3.1: - resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -2196,46 +1911,11 @@ packages: peerDependencies: eslint: '>=8.45.0' - eslint-plugin-react-dom@2.3.9: - resolution: {integrity: sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-hooks-extra@2.3.9: - resolution: {integrity: sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-naming-convention@2.3.9: - resolution: {integrity: sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-refresh@0.4.24: resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} peerDependencies: eslint: '>=8.40' - eslint-plugin-react-web-api@2.3.9: - resolution: {integrity: sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-x@2.3.9: - resolution: {integrity: sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - eslint-plugin-regexp@2.10.0: resolution: {integrity: sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==} engines: {node: ^18 || >=20} @@ -2336,9 +2016,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -2350,9 +2027,6 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} @@ -2363,10 +2037,6 @@ packages: resolution: {integrity: sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==} engines: {node: '>=6.0.0'} - fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -2376,19 +2046,9 @@ packages: fast-memoize@2.5.2: resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@4.5.3: - resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} - hasBin: true - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2405,10 +2065,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -2431,17 +2087,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreach@2.0.6: - resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -2450,9 +2095,6 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2488,9 +2130,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-source@2.0.12: - resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -2501,23 +2140,10 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@11.1.0: - resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} - engines: {node: 20 || >=22} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -2551,10 +2177,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + graphql@16.14.2: + resolution: {integrity: sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} @@ -2586,16 +2211,10 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hpagent@1.2.0: - resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} - engines: {node: '>=14'} - - http2-client@1.3.5: - resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + httpexec@0.0.2: + resolution: {integrity: sha512-g0kgwLIbUDysT06Xqy2CIEeEETcawiM50TrKpc1ZPcm+U/IkOYRhbfKDrO852X1WTfU4V0NpBQIiBPXKIAZr4g==} + engines: {node: '>=22.18.0'} + hasBin: true ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -2623,13 +2242,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@4.1.1: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2653,10 +2265,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -2701,12 +2309,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-immutable-type@5.0.1: - resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==} - peerDependencies: - eslint: '*' - typescript: '>=4.7.4' - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2719,13 +2321,6 @@ packages: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2768,10 +2363,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -2787,6 +2378,10 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + js-yaml@5.2.2: + resolution: {integrity: sha512-dayzUzKkJ1MkuUtZglSebU43utNXH0OWQByK9rKOOuYIO8M5TV1y+n8ALMdG0rdzBnfNkOmZEqrURepb0ejqBw==} + hasBin: true + jsdoc-type-pratt-parser@4.1.0: resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} engines: {node: '>=12.0.0'} @@ -2814,9 +2409,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-pointer@0.6.2: - resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} - json-schema-to-ts@2.7.2: resolution: {integrity: sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==} engines: {node: '>=16'} @@ -2845,14 +2437,13 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - jsonpath-rfc9535@1.3.0: - resolution: {integrity: sha512-3jFHya7oZ45aDxIIdx+/zQARahHXxFSMWBkcBUldfXpLS9VCXDJyTKt35kQfEXLqh0K3Ixw/9xFnvcDStaxh7Q==} - engines: {node: '>=20'} - jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + jssha@3.3.2: + resolution: {integrity: sha512-0RhFxzijV4W0qTXa97D5b6twAWXX7SEOpw8qzAZyZ+oeGOP9e84PnDSLjl7SBB1vBQ+chSUwsZR06i1AzA+nEA==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2900,43 +2491,18 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lru-cache@11.2.2: - resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} - engines: {node: 20 || >=22} - - lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - markdown-escape@2.0.0: resolution: {integrity: sha512-Trz4v0+XWlwy68LJIyw3bLbsJiC8XAbRCKF9DbEtZjyndKOGVx6n+wNB0VfoRmY2LKboQLeniap3xrb6LGSJ8A==} markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} - hasBin: true - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2977,10 +2543,6 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -3068,18 +2630,6 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3091,53 +2641,13 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} - mobx-react-lite@4.1.1: - resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} - peerDependencies: - mobx: ^6.9.0 - react: ^16.8.0 || ^17 || ^18 || ^19 - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - - mobx-react@9.2.0: - resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} - peerDependencies: - mobx: ^6.9.0 - react: ^16.8.0 || ^17 || ^18 || ^19 - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - - mobx@6.15.0: - resolution: {integrity: sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3161,17 +2671,10 @@ packages: resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} engines: {node: '>=18'} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - nimma@0.2.3: resolution: {integrity: sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==} engines: {node: ^12.20 || >=14.13} - node-fetch-h2@2.3.0: - resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} - engines: {node: 4.x || >=6.0.0} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3181,9 +2684,6 @@ packages: encoding: optional: true - node-readfiles@0.2.0: - resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} - node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -3194,29 +2694,9 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - oas-kit-common@1.0.8: - resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} - - oas-linter@3.2.2: - resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} - - oas-resolver@2.5.6: - resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} - hasBin: true - - oas-schema-walker@1.1.5: - resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} - - oas-validator@5.0.8: - resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3233,19 +2713,10 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - openapi-sampler@1.6.2: - resolution: {integrity: sha512-NyKGiFKfSWAZr4srD/5WDhInOWDhfml32h/FKUqLpEwKJt0kG0LGUU0MdyNkKrVGuJnw6DuPWq/sHCwAMpiRxg==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - outdent@0.8.0: - resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -3270,9 +2741,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.5.0: resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} @@ -3298,17 +2766,10 @@ packages: parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3316,30 +2777,23 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} - pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-scrollbar@1.5.6: - resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -3354,10 +2808,6 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} - engines: {node: '>=10'} - pony-cause@1.1.1: resolution: {integrity: sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==} engines: {node: '>=12.0.0'} @@ -3388,13 +2838,6 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -3403,20 +2846,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} - engines: {node: '>=12.0.0'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3424,29 +2853,6 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-dom@19.2.0: - resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} - peerDependencies: - react: ^19.2.0 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-tabs@6.1.0: - resolution: {integrity: sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - - react@19.2.0: - resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} - engines: {node: '>=0.10.0'} - read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -3455,28 +2861,10 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - redoc@2.5.1: - resolution: {integrity: sha512-LmqA+4A3CmhTllGG197F0arUpmChukAj9klfSdxNRemT9Hr07xXr7OGKu4PHzBs359sgrJ+4JwmOlM7nxLPGMg==} - engines: {node: '>=6.9', npm: '>=3.0.0'} - peerDependencies: - core-js: ^3.1.4 - mobx: ^6.0.4 - react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 - styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 - refa@0.12.1: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -3485,9 +2873,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - reftools@1.1.9: - resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} - regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -3512,10 +2897,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - reserved@0.1.2: - resolution: {integrity: sha512-/qO54MWj5L8WCBP9/UNe2iefJc+L9yETbH32xO/ft/EYPOTCR5k+azvDUgdCOKwZH8hXwPd0b8XBL78Nn2U69g==} - engines: {node: '>=0.8'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3532,30 +2913,15 @@ packages: engines: {node: '>= 0.4'} hasBin: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} - engines: {node: '>=10.0.0'} - hasBin: true - rollup@4.53.3: resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -3567,9 +2933,6 @@ packages: safe-stable-stringify@1.1.1: resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} @@ -3583,9 +2946,6 @@ packages: engines: {node: '>=10'} hasBin: true - set-cookie-parser@2.7.2: - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3598,9 +2958,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3609,24 +2966,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - should-equal@2.0.0: - resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} - - should-format@3.0.3: - resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} - - should-type-adaptors@1.1.0: - resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} - - should-type@1.4.0: - resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} - - should-util@1.0.1: - resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} - - should@13.2.3: - resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -3643,24 +2982,13 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-eval@1.0.1: resolution: {integrity: sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==} engines: {node: '>=12'} - simple-websocket@9.1.0: - resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slugify@1.4.7: - resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} - engines: {node: '>=8.0.0'} - smol-toml@1.5.2: resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} engines: {node: '>= 18'} @@ -3669,18 +2997,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3696,31 +3016,23 @@ packages: spdx-license-ids@3.0.22: resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + srvx@0.12.5: + resolution: {integrity: sha512-IuvtDNQg5EIwv3c6dleyau7u8hCyGQ7D6+V/QM799Aud07z0wCUcurKLTRfyG33C8oUY+UWcVBFkfHMcbtmRLA==} + engines: {node: '>=20.16.0'} + hasBin: true + stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} - stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - - stickyfill@1.1.1: - resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - string-ts@2.2.1: - resolution: {integrity: sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -3733,17 +3045,10 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3752,19 +3057,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - - styled-components@6.1.19: - resolution: {integrity: sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==} - engines: {node: '>= 16'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -3778,10 +3070,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - swagger2openapi@7.0.8: - resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} - hasBin: true - synckit@0.11.11: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3807,18 +3095,21 @@ packages: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - toml-eslint-parser@0.10.0: resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + totp-generator@2.0.1: + resolution: {integrity: sha512-50DiKmv9zKTPzCgWOqQYVBMvxh+tpL9O3IUFIqzGUlFXzJyb/IQZac8bonXudvLbfuDY8laZ9qTDX+yAvTBNSQ==} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -3843,15 +3134,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-pattern@5.9.0: - resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} - tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -3915,19 +3200,14 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -3939,10 +3219,6 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@6.22.0: - resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} - engines: {node: '>=18.17'} - unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -3968,23 +3244,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uri-js-replace@1.0.1: - resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} urijs@1.19.11: resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} - url-template@2.0.8: - resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} - - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3995,9 +3260,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - vscode-languageserver-textdocument@1.0.12: resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} @@ -4041,32 +3303,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -4086,27 +3326,15 @@ packages: resolution: {integrity: sha512-MdSgP9YA9QjtAO2+lt4O7V2bnH22LPnfeVLiQqjY3cOyn8dy/Ief8otjIe6SPPTK03nM7O3Yl0LTfWuF7l+9yw==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - yaml@2.8.2: resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} hasBin: true - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@17.0.1: - resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} - engines: {node: '>=12'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -4115,9 +3343,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.1.13: - resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -4139,32 +3364,32 @@ snapshots: '@actions/io@1.1.3': {} - '@antfu/eslint-config@3.16.0(@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@5.9.3)': + '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@7.0.2)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.9.1 '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.39.1) '@eslint/markdown': 6.6.0 - '@stylistic/eslint-plugin': 2.13.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@vitest/eslint-plugin': 1.5.0(eslint@9.39.1)(typescript@5.9.3) + '@stylistic/eslint-plugin': 2.13.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@vitest/eslint-plugin': 1.5.0(eslint@9.39.1)(typescript@7.0.2) eslint: 9.39.1 eslint-config-flat-gitignore: 1.0.1(eslint@9.39.1) eslint-flat-config-utils: 1.1.0 eslint-merge-processors: 1.0.0(eslint@9.39.1) eslint-plugin-antfu: 2.7.0(eslint@9.39.1) eslint-plugin-command: 2.1.0(eslint@9.39.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1) eslint-plugin-jsdoc: 50.8.0(eslint@9.39.1) eslint-plugin-jsonc: 2.21.0(eslint@9.39.1) - eslint-plugin-n: 17.23.1(eslint@9.39.1)(typescript@5.9.3) + eslint-plugin-n: 17.23.1(eslint@9.39.1)(typescript@7.0.2) eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 4.15.1(eslint@9.39.1)(typescript@5.9.3) + eslint-plugin-perfectionist: 4.15.1(eslint@9.39.1)(typescript@7.0.2) eslint-plugin-regexp: 2.10.0(eslint@9.39.1) eslint-plugin-toml: 0.12.0(eslint@9.39.1) eslint-plugin-unicorn: 56.0.1(eslint@9.39.1) - eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1) eslint-plugin-vue: 9.33.0(eslint@9.39.1) eslint-plugin-yml: 1.19.0(eslint@9.39.1) eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1) @@ -4178,7 +3403,6 @@ snapshots: yaml-eslint-parser: 1.3.1 yargs: 17.7.2 optionalDependencies: - '@eslint-react/eslint-plugin': 2.3.9(eslint@9.39.1)(typescript@5.9.3) eslint-plugin-react-refresh: 0.4.24(eslint@9.39.1) transitivePeerDependencies: - '@eslint/json' @@ -4196,19 +3420,14 @@ snapshots: '@antfu/utils@0.7.10': {} - '@apidevtools/json-schema-ref-parser@15.1.2(@types/json-schema@7.0.15)': - dependencies: - '@types/json-schema': 7.0.15 - js-yaml: 4.1.1 - - '@ariesclark/eslint-config@3.1.1(@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.2)': + '@ariesclark/eslint-config@3.1.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2)': dependencies: - '@antfu/eslint-config': 3.16.0(@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1)(typescript@5.9.3))(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@5.9.3) + '@antfu/eslint-config': 3.16.0(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@7.0.2) eslint: 9.39.1 eslint-flat-config-utils: 0.4.0 esno: 4.8.0 local-pkg: 0.5.1 - tsup: 8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.2) + tsup: 8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2) transitivePeerDependencies: - '@eslint-react/eslint-plugin' - '@eslint/json' @@ -4335,10 +3554,6 @@ snapshots: '@cspell/dict-vue': 3.0.5 '@cspell/dict-zig': 1.0.0 - '@cspell/cspell-json-reporter@9.3.2': - dependencies: - '@cspell/cspell-types': 9.3.2 - '@cspell/cspell-pipe@9.3.2': {} '@cspell/cspell-resolver@9.3.2': @@ -4503,14 +3718,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emotion/is-prop-valid@1.2.2': - dependencies: - '@emotion/memoize': 0.8.1 - - '@emotion/memoize@0.8.1': {} - - '@emotion/unitless@0.8.1': {} - '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 @@ -4688,79 +3895,6 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.3.9(eslint@9.39.1)(typescript@5.9.3)': - dependencies: - '@eslint-react/eff': 2.3.9 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - string-ts: 2.2.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@eslint-react/core@2.3.9(eslint@9.39.1)(typescript@5.9.3)': - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - birecord: 0.1.1 - eslint: 9.39.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@eslint-react/eff@2.3.9': {} - - '@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1)(typescript@5.9.3)': - dependencies: - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - eslint-plugin-react-dom: 2.3.9(eslint@9.39.1)(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.3.9(eslint@9.39.1)(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.3.9(eslint@9.39.1)(typescript@5.9.3) - eslint-plugin-react-web-api: 2.3.9(eslint@9.39.1)(typescript@5.9.3) - eslint-plugin-react-x: 2.3.9(eslint@9.39.1)(typescript@5.9.3) - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@eslint-react/shared@2.3.9(eslint@9.39.1)(typescript@5.9.3)': - dependencies: - '@eslint-react/eff': 2.3.9 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - zod: 4.1.13 - transitivePeerDependencies: - - supports-color - - '@eslint-react/var@2.3.9(eslint@9.39.1)(typescript@5.9.3)': - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@eslint/compat@1.4.1(eslint@9.39.1)': dependencies: '@eslint/core': 0.17.0 @@ -4832,10 +3966,6 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@exodus/schemasafe@1.3.0': {} - - '@faker-js/faker@7.6.0': {} - '@fastify/busboy@2.1.1': {} '@humanfs/core@0.19.1': {} @@ -4847,8 +3977,6 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/momoa@2.0.4': {} - '@humanwhocodes/retry@0.4.3': {} '@isaacs/balanced-match@4.0.1': {} @@ -4857,15 +3985,6 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jamesacarr/eslint-formatter-github-actions@0.2.0': dependencies: '@actions/core': 1.11.1 @@ -4903,263 +4022,45 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@noble/hashes@1.8.0': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} + '@pkgr/core@0.2.9': {} - '@nodelib/fs.walk@1.2.8': + '@redocly/ajv@8.18.1': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - '@opentelemetry/api-logs@0.202.0': + '@redocly/ajv@8.18.3': dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api@1.9.0': {} + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': + '@redocly/config@0.52.0': dependencies: - '@opentelemetry/api': 1.9.0 + json-schema-to-ts: 2.7.2 - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': + '@redocly/openapi-core@2.41.2': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.34.0 + '@redocly/ajv': 8.18.3 + '@redocly/config': 0.52.0 + ajv: '@redocly/ajv@8.18.1' + ajv-formats: 3.0.1(@redocly/ajv@8.18.1) + colorette: 1.4.0 + graphql: 16.14.2 + js-levenshtein: 1.1.6 + js-yaml: 5.2.2 + picomatch: 4.0.5 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 - '@opentelemetry/exporter-trace-otlp-http@0.202.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.202.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true - '@opentelemetry/otlp-exporter-base@0.202.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.202.0(@opentelemetry/api@1.9.0) - - '@opentelemetry/otlp-transformer@0.202.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.202.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.202.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 - - '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.34.0 - - '@opentelemetry/sdk-logs@0.202.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.202.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.34.0 - - '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/semantic-conventions@1.34.0': {} - - '@pkgr/core@0.2.9': {} - - '@protobufjs/aspromise@1.1.2': {} - - '@protobufjs/base64@1.1.2': {} - - '@protobufjs/codegen@2.0.4': {} - - '@protobufjs/eventemitter@1.1.0': {} - - '@protobufjs/fetch@1.1.0': - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - - '@protobufjs/float@1.0.2': {} - - '@protobufjs/inquire@1.1.0': {} - - '@protobufjs/path@1.1.2': {} - - '@protobufjs/pool@1.1.0': {} - - '@protobufjs/utf8@1.1.0': {} - - '@redocly/ajv@8.11.4': - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js-replace: 1.0.1 - - '@redocly/ajv@8.17.1': - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - '@redocly/cli@2.12.0(@opentelemetry/api@1.9.0)(ajv@8.17.1)(core-js@3.47.0)': - dependencies: - '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.34.0 - '@redocly/openapi-core': 2.12.0(ajv@8.17.1) - '@redocly/respect-core': 2.12.0(ajv@8.17.1) - abort-controller: 3.0.0 - chokidar: 3.6.0 - colorette: 1.4.0 - cookie: 0.7.2 - dotenv: 16.4.7 - form-data: 4.0.5 - glob: 11.1.0 - handlebars: 4.7.8 - https-proxy-agent: 7.0.6 - mobx: 6.15.0 - pluralize: 8.0.0 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - redoc: 2.5.1(core-js@3.47.0)(mobx@6.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(styled-components@6.1.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - semver: 7.7.3 - set-cookie-parser: 2.7.2 - simple-websocket: 9.1.0 - styled-components: 6.1.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - undici: 6.22.0 - yargs: 17.0.1 - transitivePeerDependencies: - - '@opentelemetry/api' - - ajv - - bufferutil - - core-js - - encoding - - react-native - - supports-color - - utf-8-validate - - '@redocly/config@0.22.2': {} - - '@redocly/config@0.40.0': - dependencies: - json-schema-to-ts: 2.7.2 - - '@redocly/config@0.41.0': - dependencies: - json-schema-to-ts: 2.7.2 - - '@redocly/openapi-core@1.34.5': - dependencies: - '@redocly/ajv': 8.17.1 - '@redocly/config': 0.22.2 - colorette: 1.4.0 - https-proxy-agent: 7.0.6 - js-levenshtein: 1.1.6 - js-yaml: 4.1.1 - minimatch: 5.1.6 - pluralize: 8.0.0 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - supports-color - - '@redocly/openapi-core@2.12.0(ajv@8.17.1)': - dependencies: - '@redocly/ajv': 8.17.1 - '@redocly/config': 0.40.0 - ajv-formats: 2.1.1(ajv@8.17.1) - colorette: 1.4.0 - js-levenshtein: 1.1.6 - js-yaml: 4.1.1 - picomatch: 4.0.3 - pluralize: 8.0.0 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - ajv - - '@redocly/openapi-core@2.12.5(ajv@8.17.1)': - dependencies: - '@redocly/ajv': 8.17.1 - '@redocly/config': 0.41.0 - ajv-formats: 3.0.1(ajv@8.17.1) - colorette: 1.4.0 - js-levenshtein: 1.1.6 - js-yaml: 4.1.1 - picomatch: 4.0.3 - pluralize: 8.0.0 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - ajv - - '@redocly/respect-core@2.12.0(ajv@8.17.1)': - dependencies: - '@faker-js/faker': 7.6.0 - '@noble/hashes': 1.8.0 - '@redocly/ajv': 8.11.4 - '@redocly/openapi-core': 2.12.0(ajv@8.17.1) - better-ajv-errors: 1.2.0(ajv@8.17.1) - colorette: 2.0.20 - json-pointer: 0.6.2 - jsonpath-rfc9535: 1.3.0 - openapi-sampler: 1.6.2 - outdent: 0.8.0 - transitivePeerDependencies: - - ajv - - '@rollup/plugin-commonjs@22.0.2(rollup@2.79.2)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 7.2.3 - is-reference: 1.2.1 - magic-string: 0.25.9 - resolve: 1.22.11 - rollup: 2.79.2 - - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.2 - - '@rollup/rollup-android-arm-eabi@4.53.3': - optional: true - - '@rollup/rollup-android-arm64@4.53.3': - optional: true + '@rollup/rollup-android-arm64@4.53.3': + optional: true '@rollup/rollup-darwin-arm64@4.53.3': optional: true @@ -5260,30 +4161,6 @@ snapshots: '@stoplight/path@1.3.2': {} - '@stoplight/spectral-cli@6.15.0': - dependencies: - '@stoplight/json': 3.21.7 - '@stoplight/path': 1.3.2 - '@stoplight/spectral-core': 1.20.0 - '@stoplight/spectral-formatters': 1.5.0 - '@stoplight/spectral-parsers': 1.0.5 - '@stoplight/spectral-ref-resolver': 1.0.5 - '@stoplight/spectral-ruleset-bundler': 1.6.3 - '@stoplight/spectral-ruleset-migrator': 1.11.3 - '@stoplight/spectral-rulesets': 1.22.0 - '@stoplight/spectral-runtime': 1.1.4 - '@stoplight/types': 13.20.0 - chalk: 4.1.2 - fast-glob: 3.2.12 - hpagent: 1.2.0 - lodash: 4.17.21 - pony-cause: 1.1.1 - stacktracey: 2.1.8 - tslib: 2.8.1 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - '@stoplight/spectral-core@1.20.0': dependencies: '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) @@ -5370,46 +4247,6 @@ snapshots: transitivePeerDependencies: - encoding - '@stoplight/spectral-ruleset-bundler@1.6.3': - dependencies: - '@rollup/plugin-commonjs': 22.0.2(rollup@2.79.2) - '@stoplight/path': 1.3.2 - '@stoplight/spectral-core': 1.20.0 - '@stoplight/spectral-formats': 1.8.2 - '@stoplight/spectral-functions': 1.10.1 - '@stoplight/spectral-parsers': 1.0.5 - '@stoplight/spectral-ref-resolver': 1.0.5 - '@stoplight/spectral-ruleset-migrator': 1.11.3 - '@stoplight/spectral-rulesets': 1.22.0 - '@stoplight/spectral-runtime': 1.1.4 - '@stoplight/types': 13.20.0 - '@types/node': 24.10.1 - pony-cause: 1.1.1 - rollup: 2.79.2 - tslib: 2.8.1 - validate-npm-package-name: 3.0.0 - transitivePeerDependencies: - - encoding - - '@stoplight/spectral-ruleset-migrator@1.11.3': - dependencies: - '@stoplight/json': 3.21.7 - '@stoplight/ordered-object-literal': 1.0.5 - '@stoplight/path': 1.3.2 - '@stoplight/spectral-functions': 1.10.1 - '@stoplight/spectral-runtime': 1.1.4 - '@stoplight/types': 13.20.0 - '@stoplight/yaml': 4.2.3 - '@types/node': 24.10.1 - ajv: 8.17.1 - ast-types: 0.14.2 - astring: 1.9.0 - reserved: 0.1.2 - tslib: 2.8.1 - validate-npm-package-name: 3.0.0 - transitivePeerDependencies: - - encoding - '@stoplight/spectral-rulesets@1.22.0': dependencies: '@asyncapi/specs': 6.10.0 @@ -5457,17 +4294,8 @@ snapshots: '@types/json-schema': 7.0.15 utility-types: 3.11.0 - '@stoplight/yaml-ast-parser@0.0.48': {} - '@stoplight/yaml-ast-parser@0.0.50': {} - '@stoplight/yaml@4.2.3': - dependencies: - '@stoplight/ordered-object-literal': 1.0.5 - '@stoplight/types': 13.20.0 - '@stoplight/yaml-ast-parser': 0.0.48 - tslib: 2.8.1 - '@stoplight/yaml@4.3.0': dependencies: '@stoplight/ordered-object-literal': 1.0.5 @@ -5475,9 +4303,9 @@ snapshots: '@stoplight/yaml-ast-parser': 0.0.50 tslib: 2.8.1 - '@stylistic/eslint-plugin@2.13.0(eslint@9.39.1)(typescript@5.9.3)': + '@stylistic/eslint-plugin@2.13.0(eslint@9.39.1)(typescript@7.0.2)': dependencies: - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) eslint: 9.39.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -5504,8 +4332,6 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@types/estree@0.0.39': {} - '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} @@ -5528,50 +4354,45 @@ snapshots: '@types/sarif@2.1.7': {} - '@types/stylis@4.2.5': {} - - '@types/trusted-types@2.0.7': - optional: true - '@types/unist@3.0.3': {} '@types/urijs@1.19.26': {} - '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@7.0.2) '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) '@typescript-eslint/visitor-keys': 8.48.0 eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2)': dependencies: '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.0(typescript@7.0.2) '@typescript-eslint/visitor-keys': 8.48.0 debug: 4.4.3 eslint: 9.39.1 - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.48.0(typescript@7.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@7.0.2) '@typescript-eslint/types': 8.48.0 debug: 4.4.3 - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -5580,47 +4401,47 @@ snapshots: '@typescript-eslint/types': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.0 - '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.48.0(typescript@7.0.2)': dependencies: - typescript: 5.9.3 + typescript: 7.0.2 - '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@7.0.2)': dependencies: '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.0(typescript@7.0.2) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) debug: 4.4.3 eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.48.0': {} - '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.48.0(typescript@7.0.2)': dependencies: - '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.48.0(typescript@7.0.2) + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@7.0.2) '@typescript-eslint/types': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.0(typescript@7.0.2) eslint: 9.39.1 - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -5629,6 +4450,66 @@ snapshots: '@typescript-eslint/types': 8.48.0 eslint-visitor-keys: 4.2.1 + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -5688,13 +4569,13 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/eslint-plugin@1.5.0(eslint@9.39.1)(typescript@5.9.3)': + '@vitest/eslint-plugin@1.5.0(eslint@9.39.1)(typescript@7.0.2)': dependencies: '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) eslint: 9.39.1 optionalDependencies: - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -5740,8 +4621,6 @@ snapshots: acorn@8.15.0: {} - agent-base@7.1.4: {} - ajv-draft-04@1.0.0(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -5754,9 +4633,9 @@ snapshots: optionalDependencies: ajv: 8.17.1 - ajv-formats@3.0.1(ajv@8.17.1): + ajv-formats@3.0.1(@redocly/ajv@8.18.1): optionalDependencies: - ajv: 8.17.1 + ajv: '@redocly/ajv@8.18.1' ajv@6.12.6: dependencies: @@ -5774,21 +4653,12 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.3: {} - any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - are-docs-informative@0.0.2: {} argparse@2.0.1: {} @@ -5810,20 +4680,10 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - as-table@1.0.55: - dependencies: - printable-characters: 1.0.42 - - ast-types@0.14.2: - dependencies: - tslib: 2.8.1 - astring@1.9.0: {} async-function@1.0.0: {} - asynckit@0.4.0: {} - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -5832,19 +4692,6 @@ snapshots: baseline-browser-mapping@2.8.31: {} - better-ajv-errors@1.2.0(ajv@8.17.1): - dependencies: - '@babel/code-frame': 7.27.1 - '@humanwhocodes/momoa': 2.0.4 - ajv: 8.17.1 - chalk: 4.1.2 - jsonpointer: 5.0.1 - leven: 3.1.0 - - binary-extensions@2.3.0: {} - - birecord@0.1.1: {} - boolbase@1.0.0: {} brace-expansion@1.1.12: @@ -5856,10 +4703,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - browserslist@4.28.0: dependencies: baseline-browser-mapping: 2.8.31 @@ -5870,8 +4713,6 @@ snapshots: builtin-modules@3.3.0: {} - builtins@1.0.3: {} - bun-types@1.3.3: dependencies: '@types/node': 24.10.1 @@ -5900,51 +4741,27 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - call-me-maybe@1.0.2: {} - callsites@3.1.0: {} - camelize@1.0.1: {} - caniuse-lite@1.0.30001757: {} ccount@2.0.1: {} - chalk-template@1.1.2: - dependencies: - chalk: 5.6.2 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} - change-case@5.4.4: {} character-entities@2.0.2: {} - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 ci-info@4.3.1: {} - classnames@2.5.1: {} - clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -5966,8 +4783,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clsx@2.1.1: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -5976,14 +4791,6 @@ snapshots: colorette@1.4.0: {} - colorette@2.0.20: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@14.0.2: {} - commander@4.1.1: {} comment-json@4.4.1: @@ -5994,10 +4801,6 @@ snapshots: comment-parser@1.4.1: {} - commondir@1.0.1: {} - - compare-versions@6.1.1: {} - concat-map@0.0.1: {} confbox@0.1.8: {} @@ -6006,14 +4809,10 @@ snapshots: consola@3.4.2: {} - cookie@0.7.2: {} - core-js-compat@3.47.0: dependencies: browserslist: 4.28.0 - core-js@3.47.0: {} - core-util-is@1.0.3: {} cross-spawn@7.0.6: @@ -6036,12 +4835,6 @@ snapshots: cspell-trie-lib: 9.3.2 fast-equals: 5.3.3 - cspell-gitignore@9.3.2: - dependencies: - '@cspell/url': 9.3.2 - cspell-glob: 9.3.2 - cspell-io: 9.3.2 - cspell-glob@9.3.2: dependencies: '@cspell/url': 9.3.2 @@ -6088,41 +4881,8 @@ snapshots: '@cspell/cspell-types': 9.3.2 gensequence: 8.0.8 - cspell@9.3.2: - dependencies: - '@cspell/cspell-json-reporter': 9.3.2 - '@cspell/cspell-pipe': 9.3.2 - '@cspell/cspell-types': 9.3.2 - '@cspell/dynamic-import': 9.3.2 - '@cspell/url': 9.3.2 - chalk: 5.6.2 - chalk-template: 1.1.2 - commander: 14.0.2 - cspell-config-lib: 9.3.2 - cspell-dictionary: 9.3.2 - cspell-gitignore: 9.3.2 - cspell-glob: 9.3.2 - cspell-io: 9.3.2 - cspell-lib: 9.3.2 - fast-json-stable-stringify: 2.1.0 - flatted: 3.3.3 - semver: 7.7.3 - tinyglobby: 0.2.15 - - css-color-keywords@1.0.0: {} - - css-to-react-native@3.2.0: - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - cssesc@3.0.0: {} - csstype@3.1.3: {} - - data-uri-to-buffer@2.0.2: {} - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -6145,8 +4905,6 @@ snapshots: dependencies: ms: 2.1.3 - decko@1.2.0: {} - decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -6165,8 +4923,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - delayed-stream@1.0.0: {} - dependency-graph@0.11.0: {} dequal@2.0.3: {} @@ -6177,26 +4933,16 @@ snapshots: diff-sequences@27.5.1: {} - dompurify@3.3.0: - optionalDependencies: - '@types/trusted-types': 2.0.7 - - dotenv@16.4.7: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.260: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 @@ -6299,8 +5045,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es6-promise@3.3.1: {} - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -6424,7 +5168,7 @@ snapshots: eslint: 9.39.1 eslint-compat-utils: 0.5.1(eslint@9.39.1) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1): dependencies: '@typescript-eslint/types': 8.48.0 comment-parser: 1.4.1 @@ -6437,7 +5181,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) transitivePeerDependencies: - supports-color @@ -6472,7 +5216,7 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-n@17.23.1(eslint@9.39.1)(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@9.39.1)(typescript@7.0.2): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) enhanced-resolve: 5.18.3 @@ -6483,119 +5227,27 @@ snapshots: globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.3 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript - - eslint-plugin-no-only-tests@3.3.0: {} - - eslint-plugin-perfectionist@4.15.1(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - natural-orderby: 5.0.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-react-dom@2.3.9(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - compare-versions: 6.1.1 - eslint: 9.39.1 - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-hooks-extra@2.3.9(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 + ts-declaration-location: 1.0.7(typescript@7.0.2) transitivePeerDependencies: - - supports-color + - typescript + + eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-react-naming-convention@2.3.9(eslint@9.39.1)(typescript@5.9.3): + eslint-plugin-perfectionist@4.15.1(eslint@9.39.1)(typescript@7.0.2): dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) eslint: 9.39.1 - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 + natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color + - typescript eslint-plugin-react-refresh@0.4.24(eslint@9.39.1): dependencies: eslint: 9.39.1 optional: true - eslint-plugin-react-web-api@2.3.9(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-x@2.3.9(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - compare-versions: 6.1.1 - eslint: 9.39.1 - is-immutable-type: 5.0.1(eslint@9.39.1)(typescript@5.9.3) - string-ts: 2.2.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - eslint-plugin-regexp@2.10.0(eslint@9.39.1): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) @@ -6637,11 +5289,11 @@ snapshots: semver: 7.7.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1): dependencies: eslint: 9.39.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2) eslint-plugin-vue@9.33.0(eslint@9.39.1): dependencies: @@ -6755,48 +5407,26 @@ snapshots: estraverse@5.3.0: {} - estree-walker@1.0.1: {} - estree-walker@2.0.2: {} esutils@2.0.3: {} event-target-shim@5.0.1: {} - eventemitter3@5.0.1: {} - exsolve@1.0.8: {} fast-deep-equal@3.1.3: {} fast-equals@5.3.3: {} - fast-glob@3.2.12: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fast-memoize@2.5.2: {} - fast-safe-stringify@2.1.1: {} - fast-uri@3.1.0: {} - fast-xml-parser@4.5.3: - dependencies: - strnum: 1.1.2 - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - fault@2.0.1: dependencies: format: 0.2.2 @@ -6809,10 +5439,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -6840,21 +5466,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreach@2.0.6: {} - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - format@0.2.2: {} fs-extra@10.1.0: @@ -6863,8 +5474,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -6905,11 +5514,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-source@2.0.12: - dependencies: - data-uri-to-buffer: 2.0.2 - source-map: 0.6.1 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -6922,32 +5526,10 @@ snapshots: github-slugger@2.0.0: {} - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - glob@11.1.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.1.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -6973,14 +5555,7 @@ snapshots: graphemer@1.4.0: {} - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 + graphql@16.14.2: {} has-bigints@1.1.0: {} @@ -7006,16 +5581,10 @@ snapshots: hosted-git-info@2.8.9: {} - hpagent@1.2.0: {} - - http2-client@1.3.5: {} - - https-proxy-agent@7.0.6: + httpexec@0.0.2: dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + srvx: 0.12.5 + tinyexec: 1.2.4 ignore@5.3.2: {} @@ -7034,13 +5603,6 @@ snapshots: indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - ini@4.1.1: {} internal-slot@1.1.0: @@ -7069,10 +5631,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -7119,16 +5677,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-immutable-type@5.0.1(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - ts-declaration-location: 1.0.7(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -7138,12 +5686,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-number@7.0.0: {} - - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.8 - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -7187,10 +5729,6 @@ snapshots: isexe@2.0.0: {} - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - joycon@3.1.1: {} js-levenshtein@1.1.6: {} @@ -7201,6 +5739,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@5.2.2: + dependencies: + argparse: 2.0.1 + jsdoc-type-pratt-parser@4.1.0: {} jsdoc-type-pratt-parser@4.8.0: {} @@ -7215,10 +5757,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-pointer@0.6.2: - dependencies: - foreach: 2.0.6 - json-schema-to-ts@2.7.2: dependencies: '@babel/runtime': 7.28.4 @@ -7252,10 +5790,10 @@ snapshots: '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) jsep: 1.4.0 - jsonpath-rfc9535@1.3.0: {} - jsonpointer@5.0.1: {} + jssha@3.3.2: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -7298,34 +5836,16 @@ snapshots: lodash@4.17.21: {} - long@5.3.2: {} - longest-streak@3.1.0: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lru-cache@11.2.2: {} - - lunr@2.3.9: {} - - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - mark.js@8.11.1: {} - markdown-escape@2.0.0: {} markdown-table@3.0.4: {} - marked@4.3.0: {} - math-intrinsics@1.1.0: {} mdast-util-find-and-replace@3.0.2: @@ -7441,8 +5961,6 @@ snapshots: dependencies: '@types/mdast': 4.0.4 - merge2@1.4.1: {} - micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.2.0 @@ -7641,17 +6159,6 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - min-indent@1.0.1: {} minimatch@10.1.1: @@ -7662,18 +6169,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 - minimist@1.2.8: {} - - minipass@7.1.2: {} - mlly@1.8.0: dependencies: acorn: 8.15.0 @@ -7681,24 +6180,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 - mobx-react-lite@4.1.1(mobx@6.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): - dependencies: - mobx: 6.15.0 - react: 19.2.0 - use-sync-external-store: 1.6.0(react@19.2.0) - optionalDependencies: - react-dom: 19.2.0(react@19.2.0) - - mobx-react@9.2.0(mobx@6.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): - dependencies: - mobx: 6.15.0 - mobx-react-lite: 4.1.1(mobx@6.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react: 19.2.0 - optionalDependencies: - react-dom: 19.2.0(react@19.2.0) - - mobx@6.15.0: {} - ms@2.1.3: {} mz@2.7.0: @@ -7715,8 +6196,6 @@ snapshots: natural-orderby@5.0.0: {} - neo-async@2.6.2: {} - nimma@0.2.3: dependencies: '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) @@ -7727,18 +6206,10 @@ snapshots: jsonpath-plus: 10.3.0 lodash.topath: 4.5.2 - node-fetch-h2@2.3.0: - dependencies: - http2-client: 1.3.5 - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-readfiles@0.2.0: - dependencies: - es6-promise: 3.3.1 - node-releases@2.0.27: {} node-sarif-builder@2.0.3: @@ -7753,43 +6224,10 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - oas-kit-common@1.0.8: - dependencies: - fast-safe-stringify: 2.1.1 - - oas-linter@3.2.2: - dependencies: - '@exodus/schemasafe': 1.3.0 - should: 13.2.3 - yaml: 1.10.2 - - oas-resolver@2.5.6: - dependencies: - node-fetch-h2: 2.3.0 - oas-kit-common: 1.0.8 - reftools: 1.1.9 - yaml: 1.10.2 - yargs: 17.0.1 - - oas-schema-walker@1.1.5: {} - - oas-validator@5.0.8: - dependencies: - call-me-maybe: 1.0.2 - oas-kit-common: 1.0.8 - oas-linter: 3.2.2 - oas-resolver: 2.5.6 - oas-schema-walker: 1.1.5 - reftools: 1.1.9 - should: 13.2.3 - yaml: 1.10.2 - object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -7805,16 +6243,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - openapi-sampler@1.6.2: - dependencies: - '@types/json-schema': 7.0.15 - fast-xml-parser: 4.5.3 - json-pointer: 0.6.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -7824,8 +6252,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - outdent@0.8.0: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -7850,8 +6276,6 @@ snapshots: p-try@2.2.0: {} - package-json-from-dist@1.0.1: {} - package-manager-detector@1.5.0: {} parent-module@1.0.1: @@ -7877,33 +6301,22 @@ snapshots: parse-statements@1.0.11: {} - path-browserify@1.0.1: {} - path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} - path-scurry@2.0.1: - dependencies: - lru-cache: 11.2.2 - minipass: 7.1.2 - pathe@1.1.2: {} pathe@2.0.3: {} - perfect-scrollbar@1.5.6: {} - picocolors@1.1.1: {} - picomatch@2.3.1: {} - picomatch@4.0.3: {} + picomatch@4.0.5: {} + pirates@4.0.7: {} pkg-types@1.3.1: @@ -7920,10 +6333,6 @@ snapshots: pluralize@8.0.0: {} - polished@4.3.1: - dependencies: - '@babel/runtime': 7.28.4 - pony-cause@1.1.1: {} possible-typed-array-names@1.1.0: {} @@ -7941,14 +6350,6 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} - - postcss@8.4.49: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -7957,56 +6358,10 @@ snapshots: prelude-ls@1.2.1: {} - printable-characters@1.0.42: {} - - prismjs@1.30.0: {} - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - protobufjs@7.5.4: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.1 - long: 5.3.2 - punycode@2.3.1: {} quansync@0.2.11: {} - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - react-dom@19.2.0(react@19.2.0): - dependencies: - react: 19.2.0 - scheduler: 0.27.0 - - react-is@16.13.1: {} - - react-tabs@6.1.0(react@19.2.0): - dependencies: - clsx: 2.1.1 - prop-types: 15.8.1 - react: 19.2.0 - - react@19.2.0: {} - read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -8020,51 +6375,8 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - readdirp@4.1.2: {} - redoc@2.5.1(core-js@3.47.0)(mobx@6.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(styled-components@6.1.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0)): - dependencies: - '@redocly/openapi-core': 1.34.5 - classnames: 2.5.1 - core-js: 3.47.0 - decko: 1.2.0 - dompurify: 3.3.0 - eventemitter3: 5.0.1 - json-pointer: 0.6.2 - lunr: 2.3.9 - mark.js: 8.11.1 - marked: 4.3.0 - mobx: 6.15.0 - mobx-react: 9.2.0(mobx@6.15.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - openapi-sampler: 1.6.2 - path-browserify: 1.0.1 - perfect-scrollbar: 1.5.6 - polished: 4.3.1 - prismjs: 1.30.0 - prop-types: 15.8.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - react-tabs: 6.1.0(react@19.2.0) - slugify: 1.4.7 - stickyfill: 1.1.1 - styled-components: 6.1.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - swagger2openapi: 7.0.8 - url-template: 2.0.8 - transitivePeerDependencies: - - encoding - - react-native - - supports-color - refa@0.12.1: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -8080,8 +6392,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - reftools@1.1.9: {} - regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -8106,8 +6416,6 @@ snapshots: require-from-string@2.0.2: {} - reserved@0.1.2: {} - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -8120,12 +6428,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} - - rollup@2.79.2: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.53.3: dependencies: '@types/estree': 1.0.8 @@ -8154,10 +6456,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -8166,8 +6464,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -8181,8 +6477,6 @@ snapshots: safe-stable-stringify@1.1.1: {} - scheduler@0.27.0: {} - scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -8193,8 +6487,6 @@ snapshots: semver@7.7.3: {} - set-cookie-parser@2.7.2: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8217,40 +6509,12 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - shallowequal@1.1.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - should-equal@2.0.0: - dependencies: - should-type: 1.4.0 - - should-format@3.0.3: - dependencies: - should-type: 1.4.0 - should-type-adaptors: 1.1.0 - - should-type-adaptors@1.1.0: - dependencies: - should-type: 1.4.0 - should-util: 1.0.1 - - should-type@1.4.0: {} - - should-util@1.0.1: {} - - should@13.2.3: - dependencies: - should-equal: 2.0.0 - should-format: 3.0.3 - should-type: 1.4.0 - should-type-adaptors: 1.1.0 - should-util: 1.0.1 - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -8279,38 +6543,18 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@4.1.0: {} - simple-eval@1.0.1: dependencies: jsep: 1.4.0 - simple-websocket@9.1.0: - dependencies: - debug: 4.4.3 - queue-microtask: 1.2.3 - randombytes: 2.1.0 - readable-stream: 3.6.2 - ws: 7.5.10 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - sisteransi@1.0.5: {} - slugify@1.4.7: {} - smol-toml@1.5.2: {} source-map-js@1.2.1: {} - source-map@0.6.1: {} - source-map@0.7.6: {} - sourcemap-codec@1.4.8: {} - spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -8330,34 +6574,21 @@ snapshots: spdx-license-ids@3.0.22: {} - stable-hash-x@0.2.0: {} - - stacktracey@2.1.8: - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 + srvx@0.12.5: {} - stickyfill@1.1.1: {} + stable-hash-x@0.2.0: {} stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 - string-ts@2.2.1: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 - string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -8381,42 +6612,16 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 strip-json-comments@3.1.1: {} - strnum@1.1.2: {} - - styled-components@6.1.19(react-dom@19.2.0(react@19.2.0))(react@19.2.0): - dependencies: - '@emotion/is-prop-valid': 1.2.2 - '@emotion/unitless': 0.8.1 - '@types/stylis': 4.2.5 - css-to-react-native: 3.2.0 - csstype: 3.1.3 - postcss: 8.4.49 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - shallowequal: 1.1.0 - stylis: 4.3.2 - tslib: 2.6.2 - - stylis@4.3.2: {} - sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -8433,22 +6638,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swagger2openapi@7.0.8: - dependencies: - call-me-maybe: 1.0.2 - node-fetch: 2.7.0 - node-fetch-h2: 2.3.0 - node-readfiles: 0.2.0 - oas-kit-common: 1.0.8 - oas-resolver: 2.5.6 - oas-schema-walker: 1.1.5 - oas-validator: 5.0.8 - reftools: 1.1.9 - yaml: 1.10.2 - yargs: 17.0.1 - transitivePeerDependencies: - - encoding - synckit@0.11.11: dependencies: '@pkgr/core': 0.2.9 @@ -8469,45 +6658,43 @@ snapshots: tinyexec@1.0.2: {} + tinyexec@1.2.4: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - toml-eslint-parser@0.10.0: dependencies: eslint-visitor-keys: 3.4.3 + totp-generator@2.0.1: + dependencies: + jssha: 3.3.2 + tr46@0.0.3: {} tree-kill@1.2.2: {} ts-algebra@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.1.0(typescript@7.0.2): dependencies: - typescript: 5.9.3 + typescript: 7.0.2 - ts-declaration-location@1.0.7(typescript@5.9.3): + ts-declaration-location@1.0.7(typescript@7.0.2): dependencies: picomatch: 4.0.3 - typescript: 5.9.3 + typescript: 7.0.2 ts-interface-checker@0.1.13: {} - ts-pattern@5.9.0: {} - tslib@1.14.1: {} - tslib@2.6.2: {} - tslib@2.8.1: {} - tsup@8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.2): + tsup@8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -8528,7 +6715,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: postcss: 8.5.6 - typescript: 5.9.3 + typescript: 7.0.2 transitivePeerDependencies: - jiti - supports-color @@ -8587,13 +6774,31 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.9.3: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 ufo@1.6.1: {} - uglify-js@3.19.3: - optional: true - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -8607,8 +6812,6 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@6.22.0: {} - unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -8660,20 +6863,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uri-js-replace@1.0.1: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 urijs@1.19.11: {} - url-template@2.0.8: {} - - use-sync-external-store@1.6.0(react@19.2.0): - dependencies: - react: 19.2.0 - util-deprecate@1.0.2: {} utility-types@3.11.0: {} @@ -8683,10 +6878,6 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@3.0.0: - dependencies: - builtins: 1.0.3 - vscode-languageserver-textdocument@1.0.12: {} vscode-uri@3.1.0: {} @@ -8758,24 +6949,12 @@ snapshots: word-wrap@1.2.5: {} - wordwrap@1.0.0: {} - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - - wrappy@1.0.2: {} - - ws@7.5.10: {} - xdg-basedir@5.1.0: {} xml-name-validator@4.0.0: {} @@ -8789,24 +6968,10 @@ snapshots: eslint-visitor-keys: 3.4.3 yaml: 2.8.2 - yaml@1.10.2: {} - yaml@2.8.2: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs@17.0.1: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -8819,6 +6984,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.1.13: {} - zwitch@2.0.4: {} diff --git a/redocly.yaml b/redocly.yaml index 9050db39..df94f3b8 100644 --- a/redocly.yaml +++ b/redocly.yaml @@ -74,3 +74,17 @@ apis: defines: - jsonschema - internal + + # Not published. The bundle the workflows run against, and what `pnpm + # test:drift` compares the captures to — it cannot see undocumented response + # fields while the schemas stay open. + test: + root: openapi/openapi.yaml + output: dist/openapi-test.yaml + preprocessors: + vrchat/x-if: + defines: + - jsonschema + - internal + decorators: + vrchat/close-schemas: on diff --git a/redocly/plugin.ts b/redocly/plugin.ts index 0f1bac83..c08a723a 100644 --- a/redocly/plugin.ts +++ b/redocly/plugin.ts @@ -1,8 +1,53 @@ import type { Plugin } from "@redocly/openapi-core"; +/** + * Schemas `close-schemas` must leave open. `/config` carries decoy properties + * that VRChat rerolls at random, so closing `APIConfig` reports a different set + * of phantom fields on every capture and never converges. + */ +const openSchemas = new Set(["APIConfig"]); + export default function myLocalPlugin(): Plugin { return { id: "vrchat", + decorators: { + oas3: { + /** + * Closes every object schema that lists properties, so a response + * carrying a field the description does not mention fails validation. + * + * Only for the conformance bundle. An open schema legally permits any + * extra property, which is correct for consumers but makes undocumented + * fields undetectable. + * + * Schemas without `properties` are left alone — those are deliberately + * free-form (`defaultContentSettings`, `appleDetails`) and closing them + * would report their entire contents as drift. + * + * `unevaluatedProperties` is a JSON Schema 2019-09 keyword and is not + * valid in this description's OpenAPI 3.0.3 dialect. It works because + * `redocly drift` validates with Ajv; a validator that only knows 3.0 + * ignores it and silently reports zero drift. Safe only while the + * `conformance` bundle stays unpublished and drift-only. + */ + "close-schemas": () => ({ + SchemaProperties: { + leave: (_, { parent }) => { + if (parent.type !== "object" || parent.additionalProperties !== undefined) return; + if (parent.unevaluatedProperties !== undefined) return; + if (openSchemas.has(parent.title)) return; + + // `unevaluatedProperties`, not `additionalProperties`: inside a + // `oneOf` branch the latter judges the whole object, so a response + // matching one branch fails every other branch once per field. + // `/auth/user` produced 89 phantom findings that way, including for + // properties the description does define. + parent.unevaluatedProperties = false; + } + } + }), + }, + }, preprocessors: { oas3: { "x-if": ({ defines = [] }: { defines?: Array }) => { diff --git a/test/.env.example b/test/.env.example new file mode 100644 index 00000000..0a5c91fb --- /dev/null +++ b/test/.env.example @@ -0,0 +1,15 @@ +# Credentials for the conformance suite. Copy to `conformance/.env` and fill in. +# `.env` is gitignored; this example is not. + +# Login, used by `pnpm conformance:login` to mint a session. That step also +# derives the account's id and display name, so neither is set here. +VRCHAT_EMAIL= +VRCHAT_PASSWORD= +VRCHAT_TOTP_SECRET= + +# Optional: only needed when the account's login name differs from its email. +VRCHAT_USERNAME= + +# Another account to exercise the friend and group-invite workflows against. +# Must not be the account above. +VRCHAT_FRIEND_ID=usr_00000000-0000-0000-0000-000000000000 diff --git a/test/arazzo.yaml b/test/arazzo.yaml new file mode 100644 index 00000000..ef898913 --- /dev/null +++ b/test/arazzo.yaml @@ -0,0 +1,10730 @@ +# yaml-language-server: $schema=https://spec.openapis.org/arazzo/1.1/schema/2026-04-15 +arazzo: 1.1.0 + +info: + title: VRChat API + version: 0.0.0 + +sourceDescriptions: + - name: default + type: openapi + url: ../dist/openapi-test.yaml + + - name: local + type: openapi + url: http://127.0.0.1:65482/openapi.json + +components: + parameters: + userAgent: + name: User-Agent + in: header + value: "specification-test/1 (https://vrchat.community)" + + session: + name: Cookie + in: header + value: $steps.basic-auth.outputs.setCookie + +workflows: + + - workflowId: login + summary: Establish a session + inputs: + type: object + required: + - username + - password + - totpSecret + properties: + username: + type: string + password: + type: string + format: password + totpSecret: + type: string + format: password + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: basic-auth + operationId: $sourceDescriptions.default.getCurrentUser + x-security: + - schemeName: authHeader + values: + username: $inputs.username + password: $inputs.password + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + setCookie: $response.header.set-cookie + + - stepId: totp-code + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: bun + args: + - -e + - import { TOTP } from "totp-generator"; + process.stdout.write((await TOTP.generate(process.argv[1])).otp) + - $inputs.totpSecret + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + code: $response.body#/stdout + + - stepId: verify-totp + operationId: $sourceDescriptions.default.verify2FA + parameters: + - reference: $components.parameters.session + requestBody: + contentType: application/json + payload: + code: $steps.totp-code.outputs.code + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/verified == true + + - stepId: auth-token + operationId: $sourceDescriptions.default.verifyAuthToken + parameters: + - reference: $components.parameters.session + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/ok == true + onFailure: + - name: stop + type: end + + outputs: + token: $response.body#/token + + - stepId: current-user + operationId: $sourceDescriptions.default.getCurrentUser + parameters: + - reference: $components.parameters.session + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + userId: $response.body#/id + displayName: $response.body#/displayName + + - stepId: cache-session + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - printf %s "$1" > test/.out/session + - sh + - $steps.auth-token.outputs.token + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + + - stepId: cache-user-id + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - printf %s "$1" > test/.out/user-id + - sh + - $steps.current-user.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + + - stepId: cache-display-name + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - printf %s "$1" > test/.out/display-name + - sh + - $steps.current-user.outputs.displayName + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + + - workflowId: session + summary: Read the cached session + steps: + - stepId: read-session + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: cat + args: + - test/.out/session + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + outputs: + value: $response.body#/stdout + + - stepId: read-user-id + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: cat + args: + - test/.out/user-id + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + outputs: + value: $response.body#/stdout + + - stepId: read-display-name + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: cat + args: + - test/.out/display-name + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + outputs: + value: $response.body#/stdout + + - stepId: verify + operationId: $sourceDescriptions.default.verifyAuthToken + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $steps.read-session.outputs.value + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/ok == true + onFailure: + - name: stop + type: end + + outputs: + sessionToken: $steps.read-session.outputs.value + userId: $steps.read-user-id.outputs.value + displayName: $steps.read-display-name.outputs.value + + - workflowId: cancel-pending-2fa-unauthenticated + summary: cancelPending2FA refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: cancel-pending-2fa + operationId: $sourceDescriptions.default.cancelPending2FA + successCriteria: + - condition: $statusCode == 401 + + - workflowId: check-user-exists-by-display-name + summary: By display name + inputs: + type: object + required: + - username + - email + properties: + username: + type: string + email: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: by-display-name + operationId: $sourceDescriptions.default.checkUserExists + parameters: + - name: displayName + in: query + value: $workflows.session.outputs.displayName + successCriteria: + - condition: $statusCode == 200 || $statusCode == 429 + - workflowId: check-user-exists-by-email + summary: By email + inputs: + type: object + required: + - username + - email + properties: + username: + type: string + email: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: by-email + operationId: $sourceDescriptions.default.checkUserExists + parameters: + - name: email + in: query + value: $inputs.email + successCriteria: + - condition: $statusCode == 200 || $statusCode == 429 + + - workflowId: check-user-exists-by-username + summary: By username + inputs: + type: object + required: + - username + - email + properties: + username: + type: string + email: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: by-username + operationId: $sourceDescriptions.default.checkUserExists + parameters: + - name: username + in: query + value: $inputs.username + successCriteria: + - condition: $statusCode == 200 || $statusCode == 429 + + - workflowId: check-user-exists-no-parameters + summary: Exists no parameters + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: exists-no-parameters + operationId: $sourceDescriptions.default.checkUserExists + successCriteria: + - condition: $statusCode == 400 + + - workflowId: avatar-moderation-lifecycle + summary: Block an avatar globally, confirm it is listed, then unblock it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: block-avatar + operationId: $sourceDescriptions.default.createGlobalAvatarModeration + requestBody: + contentType: application/json + payload: + avatarModerationType: block + targetAvatarId: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + - stepId: verify-listed + operationId: $sourceDescriptions.default.getGlobalAvatarModerations + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/targetAvatarId == + 'avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11' + + - stepId: unblock-avatar + operationId: $sourceDescriptions.default.deleteGlobalAvatarModeration + parameters: + - name: avatarModerationType + in: query + value: block + - name: targetAvatarId + in: query + value: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: create-global-avatar-moderation-unauthenticated + summary: createGlobalAvatarModeration refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-global-avatar-moderation + operationId: $sourceDescriptions.default.createGlobalAvatarModeration + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-moderation-report-unauthenticated + summary: deleteModerationReport refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-moderation-report + operationId: $sourceDescriptions.default.deleteModerationReport + parameters: + - name: moderationReportId + in: path + value: mrep_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-user-unauthenticated + summary: deleteUser refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-user + operationId: $sourceDescriptions.default.deleteUser + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: disable-2fa-unauthenticated + summary: disable2FA refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: disable-2fa + operationId: $sourceDescriptions.default.disable2FA + successCriteria: + - condition: $statusCode == 401 + + - workflowId: enable-2fa-unauthenticated + summary: enable2FA refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: enable-2fa + operationId: $sourceDescriptions.default.enable2FA + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-current-user + summary: Current user + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: current-user + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/id == $workflows.session.outputs.userId + + - workflowId: get-current-user-unauthenticated + summary: getCurrentUser refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-current-user + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-global-avatar-moderations + summary: Avatar moderations + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: avatar-moderations + operationId: $sourceDescriptions.default.getGlobalAvatarModerations + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-global-avatar-moderations-unauthenticated + summary: getGlobalAvatarModerations refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-global-avatar-moderations + operationId: $sourceDescriptions.default.getGlobalAvatarModerations + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-moderation-reports + summary: Moderation reports + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: moderation-reports + operationId: $sourceDescriptions.default.getModerationReports + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-moderation-reports-query-parameters + summary: getModerationReports with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-moderation-reports + operationId: $sourceDescriptions.default.getModerationReports + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-moderation-reports-unauthenticated + summary: getModerationReports refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-moderation-reports + operationId: $sourceDescriptions.default.getModerationReports + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-o-auth-redirect-code + summary: Oauth redirect code + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: oauth-redirect-code + operationId: $sourceDescriptions.default.getOAuthRedirectCode + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/code != null + + - workflowId: get-recovery-codes-unauthenticated + summary: getRecoveryCodes refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-recovery-codes + operationId: $sourceDescriptions.default.getRecoveryCodes + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-sso-token-canny + summary: SSO token for Canny + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: sso-canny + operationId: $sourceDescriptions.default.getSsoToken + parameters: + - name: provider + in: path + value: canny + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/token != null + + - workflowId: get-sso-token-furality + summary: SSO token for Furality + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: sso-furality + operationId: $sourceDescriptions.default.getSsoToken + parameters: + - name: provider + in: path + value: furality + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/token != null + + - workflowId: get-sso-token-unsupported + summary: SSO token for an unsupported provider is refused + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: sso-unsupported + operationId: $sourceDescriptions.default.getSsoToken + parameters: + - name: provider + in: path + value: conformance + successCriteria: + - condition: $statusCode == 400 + - workflowId: logout + summary: >- + Invalidates the session, so `pnpm conformance` skips it by name — running + it would break the cached token every later workflow depends on. Drive it + directly when you want to exercise logout. + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: logout + operationId: $sourceDescriptions.default.logout + successCriteria: + - condition: $statusCode == 200 + + - stepId: current-user-after-logout + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 401 + + - workflowId: logout-unauthenticated + summary: logout refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: logout + operationId: $sourceDescriptions.default.logout + successCriteria: + - condition: $statusCode == 401 + + - workflowId: resend-email-confirmation-unauthenticated + summary: resendEmailConfirmation refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: resend-email-confirmation + operationId: $sourceDescriptions.default.resendEmailConfirmation + successCriteria: + - condition: $statusCode == 401 + + - workflowId: submit-moderation-report-unauthenticated + summary: submitModerationReport refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: submit-moderation-report + operationId: $sourceDescriptions.default.submitModerationReport + successCriteria: + - condition: $statusCode == 401 + + - workflowId: verify-2fa-unauthenticated + summary: verify2FA refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-2fa + operationId: $sourceDescriptions.default.verify2FA + successCriteria: + - condition: $statusCode == 401 + + - workflowId: verify-2fa-with-code-unauthenticated + summary: Verify 2fa no credentials + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-2fa-no-credentials + operationId: $sourceDescriptions.default.verify2FA + requestBody: + contentType: application/json + payload: + code: "000000" + successCriteria: + - condition: $statusCode == 401 + + - workflowId: verify-2fa-email-code-unauthenticated + summary: verify2FAEmailCode refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-2fa-email-code + operationId: $sourceDescriptions.default.verify2FAEmailCode + successCriteria: + - condition: $statusCode == 401 + + - workflowId: verify-auth-token + summary: Verify auth token + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: verify-auth-token + operationId: $sourceDescriptions.default.verifyAuthToken + successCriteria: + - condition: $statusCode == 200 + + - workflowId: verify-auth-token-unauthenticated + summary: verifyAuthToken refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-auth-token + operationId: $sourceDescriptions.default.verifyAuthToken + successCriteria: + - condition: $statusCode == 401 + + - workflowId: verify-pending-2fa-unauthenticated + summary: verifyPending2FA refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-pending-2fa + operationId: $sourceDescriptions.default.verifyPending2FA + successCriteria: + - condition: $statusCode == 401 + + - workflowId: verify-recovery-code-unauthenticated + summary: verifyRecoveryCode refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-recovery-code + operationId: $sourceDescriptions.default.verifyRecoveryCode + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-avatar-not-found + summary: deleteAvatar refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-avatar + operationId: $sourceDescriptions.default.deleteAvatar + parameters: + - name: avatarId + in: path + value: avtr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-avatar-unauthenticated + summary: deleteAvatar refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-avatar + operationId: $sourceDescriptions.default.deleteAvatar + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-impostor-not-found + summary: deleteImpostor refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-impostor + operationId: $sourceDescriptions.default.deleteImpostor + parameters: + - name: avatarId + in: path + value: avtr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-impostor-unauthenticated + summary: deleteImpostor refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-impostor + operationId: $sourceDescriptions.default.deleteImpostor + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: enqueue-impostor-unauthenticated + summary: enqueueImpostor refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: enqueue-impostor + operationId: $sourceDescriptions.default.enqueueImpostor + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-avatar-not-found + summary: getAvatar refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-avatar + operationId: $sourceDescriptions.default.getAvatar + parameters: + - name: avatarId + in: path + value: avtr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-avatar-unauthenticated + summary: getAvatar refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-avatar + operationId: $sourceDescriptions.default.getAvatar + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-avatar-styles + summary: Avatar styles + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: avatar-styles + operationId: $sourceDescriptions.default.getAvatarStyles + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorited-avatars-query-parameters + summary: getFavoritedAvatars with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-favorited-avatars + operationId: $sourceDescriptions.default.getFavoritedAvatars + parameters: + - name: featured + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: ascending + - name: releaseStatus + in: query + value: public + - name: sort + in: query + value: _created_at + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorited-avatars-unauthenticated + summary: getFavoritedAvatars refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-favorited-avatars + operationId: $sourceDescriptions.default.getFavoritedAvatars + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-impostor-queue-stats + summary: Impostor queue stats + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: impostor-queue-stats + operationId: $sourceDescriptions.default.getImpostorQueueStats + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-impostor-queue-stats-unauthenticated + summary: getImpostorQueueStats refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-impostor-queue-stats + operationId: $sourceDescriptions.default.getImpostorQueueStats + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-licensed-avatars + summary: Licensed avatars + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: licensed-avatars + operationId: $sourceDescriptions.default.getLicensedAvatars + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-licensed-avatars-query-parameters + summary: getLicensedAvatars with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-licensed-avatars + operationId: $sourceDescriptions.default.getLicensedAvatars + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-licensed-avatars-unauthenticated + summary: getLicensedAvatars refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-licensed-avatars + operationId: $sourceDescriptions.default.getLicensedAvatars + successCriteria: + - condition: $statusCode == 401 + + - workflowId: avatar-lifecycle + summary: Avatar lookups and selection + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-avatar + operationId: $sourceDescriptions.default.getOwnAvatar + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - stepId: search-avatars + operationId: $sourceDescriptions.default.searchAvatars + successCriteria: + - condition: $statusCode == 200 + + - stepId: search-avatars-featured + operationId: $sourceDescriptions.default.searchAvatars + parameters: + - name: tag + in: query + value: admin_featured_legacy + successCriteria: + - condition: $statusCode == 200 + + - stepId: get-avatar + operationId: $sourceDescriptions.default.getAvatar + parameters: + - name: avatarId + in: path + value: avtr_26187637-0c30-4a09-86e1-bc928c07309e + successCriteria: + - condition: $statusCode == 200 + + - stepId: select-avatar + operationId: $sourceDescriptions.default.selectAvatar + parameters: + - name: avatarId + in: path + value: avtr_26187637-0c30-4a09-86e1-bc928c07309e + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-avatar-selected + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/currentAvatar == + 'avtr_26187637-0c30-4a09-86e1-bc928c07309e' + + - stepId: select-default-avatar + operationId: $sourceDescriptions.default.selectAvatar + parameters: + - name: avatarId + in: path + value: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-default-restored + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/currentAvatar == + 'avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11' + + - stepId: select-fallback-rejected + operationId: $sourceDescriptions.default.selectFallbackAvatar + parameters: + - name: avatarId + in: path + value: avtr_26187637-0c30-4a09-86e1-bc928c07309e + successCriteria: + - condition: $statusCode == 403 + + - stepId: select-fallback + operationId: $sourceDescriptions.default.selectFallbackAvatar + parameters: + - name: avatarId + in: path + value: avtr_07917a03-5e0b-48e9-b041-e94086bc658f + successCriteria: + - condition: $statusCode == 200 + + - stepId: favorited-avatars + operationId: $sourceDescriptions.default.getFavoritedAvatars + successCriteria: + - condition: $statusCode == 200 + + - stepId: get-unknown-avatar + operationId: $sourceDescriptions.default.getAvatar + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-own-avatar-unauthenticated + summary: getOwnAvatar refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-own-avatar + operationId: $sourceDescriptions.default.getOwnAvatar + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: search-avatars-query-parameters + summary: searchAvatars with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-avatars + operationId: $sourceDescriptions.default.searchAvatars + parameters: + - name: featured + in: query + value: false + - name: isInternalVariant + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: ascending + - name: releaseStatus + in: query + value: public + - name: sort + in: query + value: _created_at + - name: user + in: query + value: me + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-avatars-unauthenticated + summary: searchAvatars refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: search-avatars + operationId: $sourceDescriptions.default.searchAvatars + successCriteria: + - condition: $statusCode == 401 + + - workflowId: select-avatar-not-found + summary: selectAvatar refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: select-avatar + operationId: $sourceDescriptions.default.selectAvatar + parameters: + - name: avatarId + in: path + value: avtr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: select-avatar-unauthenticated + summary: selectAvatar refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: select-avatar + operationId: $sourceDescriptions.default.selectAvatar + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: select-fallback-avatar-not-found + summary: selectFallbackAvatar refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: select-fallback-avatar + operationId: $sourceDescriptions.default.selectFallbackAvatar + parameters: + - name: avatarId + in: path + value: avtr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: select-fallback-avatar-unauthenticated + summary: selectFallbackAvatar refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: select-fallback-avatar + operationId: $sourceDescriptions.default.selectFallbackAvatar + parameters: + - name: avatarId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-avatar-not-found + summary: updateAvatar refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-avatar + operationId: $sourceDescriptions.default.updateAvatar + parameters: + - name: avatarId + in: path + value: avtr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 400 + - workflowId: group-calendar-lifecycle + summary: Creates a group and a calendar event on it, then removes both + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: short-code + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - openssl rand -hex 2 | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: starts-at + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - date -u -d '+3600 seconds' +%Y-%m-%dT%H:%M:%S.%3NZ | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: ends-at + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - date -u -d '+7200 seconds' +%Y-%m-%dT%H:%M:%S.%3NZ | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: create-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.createGroup + requestBody: + contentType: application/json + payload: + name: Test Calendar + roleTemplate: default + shortCode: $steps.short-code.outputs.value + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/id + + - stepId: create-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.createGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + requestBody: + contentType: application/json + payload: + accessType: group + category: other + description: Test Description + title: Test Event + sendCreationNotification: false + startsAt: $steps.starts-at.outputs.value + endsAt: $steps.ends-at.outputs.value + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + calendarId: $response.body#/id + + - stepId: calendar-events + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - stepId: featured-events + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getFeaturedCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - stepId: follow-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.followGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + requestBody: + contentType: application/json + payload: + isFollowing: true + successCriteria: + - condition: $statusCode == 200 + + - stepId: followed-events + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getFollowedCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - stepId: group-events + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupCalendarEvents + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: group-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + successCriteria: + - condition: $statusCode == 200 + + - stepId: update-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + requestBody: + contentType: application/json + payload: + title: Updated Event Title + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/title == 'Updated Event Title' + + - stepId: verify-event-updated + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/title == 'Updated Event Title' + + - stepId: missing-event-ics + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupCalendarEventICS + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: cal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 404 + + - stepId: search-events + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.searchCalendarEvents + parameters: + - name: searchTerm + in: query + value: game + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.deleteGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-event-deleted + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + successCriteria: + - condition: $statusCode == 404 + + - stepId: delete-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.deleteGroup + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: create-group-calendar-event-unauthenticated + summary: createGroupCalendarEvent refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-group-calendar-event + operationId: $sourceDescriptions.default.createGroupCalendarEvent + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-calendar-event-not-found + summary: deleteGroupCalendarEvent refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group-calendar-event + operationId: $sourceDescriptions.default.deleteGroupCalendarEvent + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: calendarId + in: path + value: cal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-group-calendar-event-unauthenticated + summary: deleteGroupCalendarEvent refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-calendar-event + operationId: $sourceDescriptions.default.deleteGroupCalendarEvent + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: calendarId + in: path + value: cal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: discover-calendar-events + summary: Discover events + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: discover-events + operationId: $sourceDescriptions.default.discoverCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - workflowId: discover-calendar-events-anonymous + summary: Calendar discovery needs no session + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: discover + operationId: $sourceDescriptions.default.discoverCalendarEvents + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/results != null + + - workflowId: discover-calendar-events-query-parameters + summary: discoverCalendarEvents with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: discover-calendar-events + operationId: $sourceDescriptions.default.discoverCalendarEvents + parameters: + - name: featuredResults + in: query + value: exclude + - name: minimumInterestCount + in: query + value: 5 + - name: minimumRemainingMinutes + in: query + value: 10 + - name: n + in: query + value: 1 + - name: nonFeaturedResults + in: query + value: exclude + - name: personalizedResults + in: query + value: exclude + - name: scope + in: query + value: all + - name: upcomingOffsetMinutes + in: query + value: 10080 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: follow-group-calendar-event-unauthenticated + summary: followGroupCalendarEvent refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: follow-group-calendar-event + operationId: $sourceDescriptions.default.followGroupCalendarEvent + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: calendarId + in: path + value: cal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-calendar-events + summary: Calendar events + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: calendar-events + operationId: $sourceDescriptions.default.getCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-calendar-events-query-parameters + summary: getCalendarEvents with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-calendar-events + operationId: $sourceDescriptions.default.getCalendarEvents + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-calendar-events-unauthenticated + summary: getCalendarEvents refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-calendar-events + operationId: $sourceDescriptions.default.getCalendarEvents + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-featured-calendar-events + summary: Featured events + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: featured-events + operationId: $sourceDescriptions.default.getFeaturedCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-featured-calendar-events-anonymous + summary: Featured calendar events need no session + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: featured + operationId: $sourceDescriptions.default.getFeaturedCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-featured-calendar-events-query-parameters + summary: getFeaturedCalendarEvents with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-featured-calendar-events + operationId: $sourceDescriptions.default.getFeaturedCalendarEvents + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-followed-calendar-events + summary: Followed events + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: followed-events + operationId: $sourceDescriptions.default.getFollowedCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-followed-calendar-events-query-parameters + summary: getFollowedCalendarEvents with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-followed-calendar-events + operationId: $sourceDescriptions.default.getFollowedCalendarEvents + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-followed-calendar-events-unauthenticated + summary: getFollowedCalendarEvents refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-followed-calendar-events + operationId: $sourceDescriptions.default.getFollowedCalendarEvents + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-calendar-event-ics-not-found + summary: getGroupCalendarEventICS refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-calendar-event-ics + operationId: $sourceDescriptions.default.getGroupCalendarEventICS + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: calendarId + in: path + value: cal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-group-calendar-event-ics-unauthenticated + summary: getGroupCalendarEventICS refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-calendar-event-ics + operationId: $sourceDescriptions.default.getGroupCalendarEventICS + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: calendarId + in: path + value: cal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-calendar-events-unauthenticated + summary: getGroupCalendarEvents refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-calendar-events + operationId: $sourceDescriptions.default.getGroupCalendarEvents + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-next-calendar-event-not-found + summary: getGroupNextCalendarEvent refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-next-calendar-event + operationId: $sourceDescriptions.default.getGroupNextCalendarEvent + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-group-next-calendar-event-unauthenticated + summary: getGroupNextCalendarEvent refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-next-calendar-event + operationId: $sourceDescriptions.default.getGroupNextCalendarEvent + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: calendar-event-lifecycle + summary: Create a calendar event on an owned group, read it, update it, delete it + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: starts-at + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - date -u -d '+3600 seconds' +%Y-%m-%dT%H:%M:%S.%3NZ | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: ends-at + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - date -u -d '+7200 seconds' +%Y-%m-%dT%H:%M:%S.%3NZ | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: own-groups + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: create-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.createGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + accessType: group + category: other + description: Created by the conformance suite + title: Conformance + sendCreationNotification: false + startsAt: $steps.starts-at.outputs.value + endsAt: $steps.ends-at.outputs.value + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + calendarId: $response.body#/id + + - stepId: get-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/title == 'Conformance' + + - stepId: update-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + requestBody: + contentType: application/json + payload: + title: Conformance renamed + description: Updated by the conformance suite + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-event + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.deleteGroupCalendarEvent + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: calendarId + in: path + value: $steps.create-event.outputs.calendarId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-calendar-events + summary: Search events + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-events + operationId: $sourceDescriptions.default.searchCalendarEvents + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-calendar-events-query-parameters + summary: searchCalendarEvents with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-calendar-events + operationId: $sourceDescriptions.default.searchCalendarEvents + parameters: + - name: searchTerm + in: query + value: test + - name: isInternalVariant + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: utcOffset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-calendar-events-unauthenticated + summary: searchCalendarEvents refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: search-calendar-events + operationId: $sourceDescriptions.default.searchCalendarEvents + parameters: + - name: searchTerm + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: create-product-unauthenticated + summary: createProduct refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-product + operationId: $sourceDescriptions.default.createProduct + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-product-unauthenticated + summary: deleteProduct refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-product + operationId: $sourceDescriptions.default.deleteProduct + parameters: + - name: productId + in: path + value: prod_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-product-listing-direct-unauthenticated + summary: deleteProductListingDirect refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-product-listing-direct + operationId: $sourceDescriptions.default.deleteProductListingDirect + parameters: + - name: productId + in: path + value: prod_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-active-licenses + summary: List active licences + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: active-licenses + operationId: $sourceDescriptions.default.getActiveLicenses + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-active-licenses-unauthenticated + summary: getActiveLicenses refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-active-licenses + operationId: $sourceDescriptions.default.getActiveLicenses + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-balance + summary: Read the account's balance + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: balance + operationId: $sourceDescriptions.default.getBalance + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/balance != null + + - workflowId: get-balance-earnings + summary: Read balance earnings + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: balance-earnings + operationId: $sourceDescriptions.default.getBalanceEarnings + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-balance-earnings-not-found + summary: getBalanceEarnings refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-balance-earnings + operationId: $sourceDescriptions.default.getBalanceEarnings + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-bulk-gift-purchases + summary: List bulk gift purchases + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: bulk-gift-purchases + operationId: $sourceDescriptions.default.getBulkGiftPurchases + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-bulk-gift-purchases-query-parameters + summary: getBulkGiftPurchases with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-bulk-gift-purchases + operationId: $sourceDescriptions.default.getBulkGiftPurchases + parameters: + - name: mostRecent + in: query + value: false + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-bulk-gift-purchases-unauthenticated + summary: getBulkGiftPurchases refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-bulk-gift-purchases + operationId: $sourceDescriptions.default.getBulkGiftPurchases + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-current-subscriptions + summary: Read the account's active subscriptions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: current-subscriptions + operationId: $sourceDescriptions.default.getCurrentSubscriptions + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-current-subscriptions-unauthenticated + summary: getCurrentSubscriptions refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-current-subscriptions + operationId: $sourceDescriptions.default.getCurrentSubscriptions + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-earnings-metrics + summary: Read seller earnings metrics + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: earnings-metrics + operationId: $sourceDescriptions.default.getEarningsMetrics + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-earnings-metrics-unauthenticated + summary: getEarningsMetrics refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-earnings-metrics + operationId: $sourceDescriptions.default.getEarningsMetrics + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-economy-account + summary: Read the economy account + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: economy-account + operationId: $sourceDescriptions.default.getEconomyAccount + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-economy-account-unauthenticated + summary: getEconomyAccount refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-economy-account + operationId: $sourceDescriptions.default.getEconomyAccount + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-economy-balances + summary: Economy balances + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: economy-balances + operationId: $sourceDescriptions.default.getEconomyBalances + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-economy-balances-unauthenticated + summary: getEconomyBalances refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-economy-balances + operationId: $sourceDescriptions.default.getEconomyBalances + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-economy-payout-status + summary: Economy payout status + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: economy-payout-status + operationId: $sourceDescriptions.default.getEconomyPayoutStatus + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 400 + + - workflowId: get-economy-payout-status-unauthenticated + summary: getEconomyPayoutStatus refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-economy-payout-status + operationId: $sourceDescriptions.default.getEconomyPayoutStatus + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-economy-payouts + summary: Economy payouts + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: economy-payouts + operationId: $sourceDescriptions.default.getEconomyPayouts + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-economy-payouts-unauthenticated + summary: getEconomyPayouts refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-economy-payouts + operationId: $sourceDescriptions.default.getEconomyPayouts + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-license-group + summary: Read a licence group + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: license-group + operationId: $sourceDescriptions.default.getLicenseGroup + parameters: + - name: licenseGroupId + in: path + value: lgrp_608513da-b213-4e15-80af-bd88c27f0979 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-license-group-unauthenticated + summary: getLicenseGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-license-group + operationId: $sourceDescriptions.default.getLicenseGroup + parameters: + - name: licenseGroupId + in: path + value: lgrp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-listing-unauthenticated + summary: getProductListing refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-listing + operationId: $sourceDescriptions.default.getProductListing + parameters: + - name: productId + in: path + value: prod_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-listing-alternate-unauthenticated + summary: getProductListingAlternate refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-listing-alternate + operationId: $sourceDescriptions.default.getProductListingAlternate + parameters: + - name: productId + in: path + value: prod_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-listings-query-parameters + summary: getProductListings with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-product-listings + operationId: $sourceDescriptions.default.getProductListings + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: active + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-product-listings-unauthenticated + summary: getProductListings refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-listings + operationId: $sourceDescriptions.default.getProductListings + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-purchase-unauthenticated + summary: getProductPurchase refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-purchase + operationId: $sourceDescriptions.default.getProductPurchase + parameters: + - name: productPurchaseId + in: path + value: ppur_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-purchase-history + summary: Purchase history + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: purchase-history + operationId: $sourceDescriptions.default.getProductPurchaseHistory + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-product-purchase-history-query-parameters + summary: getProductPurchaseHistory with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-product-purchase-history + operationId: $sourceDescriptions.default.getProductPurchaseHistory + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: n + in: query + value: 1 + - name: order + in: query + value: asc + - name: sort + in: query + value: purchaseDate + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-product-purchase-history-unauthenticated + summary: getProductPurchaseHistory refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-purchase-history + operationId: $sourceDescriptions.default.getProductPurchaseHistory + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-purchase-stacks-unauthenticated + summary: getProductPurchaseStacks refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-purchase-stacks + operationId: $sourceDescriptions.default.getProductPurchaseStacks + parameters: + - name: productPurchaseId + in: path + value: ppur_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-product-purchases + summary: List the account's product purchases + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: purchases + operationId: $sourceDescriptions.default.getProductPurchases + parameters: + - name: buyerId + in: query + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-product-purchases-query-parameters + summary: getProductPurchases with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-product-purchases + operationId: $sourceDescriptions.default.getProductPurchases + parameters: + - name: buyerId + in: query + value: $workflows.session.outputs.userId + - name: mostRecent + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: asc + - name: sort + in: query + value: purchaseDate + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-product-purchases-unauthenticated + summary: getProductPurchases refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-product-purchases + operationId: $sourceDescriptions.default.getProductPurchases + parameters: + - name: buyerId + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-recent-subscription + summary: Read the most recent subscription + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: recent-subscription + operationId: $sourceDescriptions.default.getRecentSubscription + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-recent-subscription-unauthenticated + summary: getRecentSubscription refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-recent-subscription + operationId: $sourceDescriptions.default.getRecentSubscription + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-seller-eligibility + summary: Seller eligibility is withdrawn + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: seller-eligibility + operationId: $sourceDescriptions.default.getSellerEligibility + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-steam-transaction-unauthenticated + summary: getSteamTransaction refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-steam-transaction + operationId: $sourceDescriptions.default.getSteamTransaction + parameters: + - name: transactionId + in: path + value: txn_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: economy-known-failing + summary: Marked test.failing upstream, kept apart so they do not stop the rest + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: steam-transactions + operationId: $sourceDescriptions.default.getSteamTransactions + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + transactionId: $response.body#/0/id + + - stepId: steam-transaction + operationId: $sourceDescriptions.default.getSteamTransaction + parameters: + - name: transactionId + in: path + value: $steps.steam-transactions.outputs.transactionId + successCriteria: + - condition: $statusCode == 200 + + - stepId: product-listing + operationId: $sourceDescriptions.default.getProductListing + parameters: + - name: productId + in: path + value: prod_c9d1cf9b-e3be-4bed-8386-49f0a8d32910 + successCriteria: + - condition: $statusCode == 200 + + - stepId: product-listings + operationId: $sourceDescriptions.default.getProductListings + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: hydrate + in: query + value: true + successCriteria: + - condition: $statusCode == 200 + + - stepId: product-listings-foreign + operationId: $sourceDescriptions.default.getProductListings + parameters: + - name: userId + in: path + value: usr_3d10ca69-6586-40a3-aa1b-a0c9e38a0d20 + - name: hydrate + in: query + value: true + successCriteria: + - condition: $statusCode == 403 + + - stepId: store + operationId: $sourceDescriptions.default.getStore + parameters: + - name: storeId + in: query + value: esto_00000000-0000-0000-0000-000000000000 + - name: hydrateListings + in: query + value: true + - name: hydrateProducts + in: query + value: true + successCriteria: + - condition: $statusCode == 200 + + - stepId: store-shelves + operationId: $sourceDescriptions.default.getStoreShelves + parameters: + - name: storeId + in: query + value: esto_00000000-0000-0000-0000-000000000000 + - name: hydrateListings + in: query + value: true + - name: fetch + in: query + value: all + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-steam-transactions-unauthenticated + summary: getSteamTransactions refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-steam-transactions + operationId: $sourceDescriptions.default.getSteamTransactions + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-subscriptions + summary: List purchasable subscriptions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: subscriptions + operationId: $sourceDescriptions.default.getSubscriptions + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-subscriptions-query-parameters + summary: getSubscriptions returning giftable subscriptions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: subscriptions-gifts + operationId: $sourceDescriptions.default.getSubscriptions + parameters: + - name: gifts + in: query + value: true + - name: recurring + in: query + value: false + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-subscriptions-unauthenticated + summary: getSubscriptions refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-subscriptions + operationId: $sourceDescriptions.default.getSubscriptions + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-tilia-status + summary: Read Tilia service status + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: tilia-status + operationId: $sourceDescriptions.default.getTiliaStatus + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-tilia-tos + summary: Read the Tilia terms of service state + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: tilia-tos + operationId: $sourceDescriptions.default.getTiliaTos + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-tilia-tos-not-found + summary: getTiliaTos refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-tilia-tos + operationId: $sourceDescriptions.default.getTiliaTos + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-token-bundles + summary: List token bundles + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: token-bundles + operationId: $sourceDescriptions.default.getTokenBundles + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-token-bundles-unauthenticated + summary: getTokenBundles refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-token-bundles + operationId: $sourceDescriptions.default.getTokenBundles + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-credits-eligible + summary: User credits eligibility is withdrawn + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: credits-eligible + operationId: $sourceDescriptions.default.getUserCreditsEligible + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-user-credits-eligible-not-found + summary: getUserCreditsEligible refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-user-credits-eligible + operationId: $sourceDescriptions.default.getUserCreditsEligible + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-user-subscription-eligible + summary: Check subscription eligibility + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: subscription-eligible + operationId: $sourceDescriptions.default.getUserSubscriptionEligible + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-subscription-eligible-unauthenticated + summary: getUserSubscriptionEligible refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-subscription-eligible + operationId: $sourceDescriptions.default.getUserSubscriptionEligible + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-tilia-kyc + summary: Tilia kyc + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: tilia-kyc + operationId: $sourceDescriptions.default.getUserTiliaKyc + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 400 + + - workflowId: get-user-tilia-kyc-unauthenticated + summary: getUserTiliaKyc refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-tilia-kyc + operationId: $sourceDescriptions.default.getUserTiliaKyc + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: list-stores + summary: List a seller's stores + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: stores + operationId: $sourceDescriptions.default.listStores + parameters: + - name: sellerId + in: query + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 403 + + - workflowId: list-stores-query-parameters + summary: listStores with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: list-stores + operationId: $sourceDescriptions.default.listStores + parameters: + - name: sellerId + in: query + value: $workflows.session.outputs.userId + - name: managementPov + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: list-stores-unauthenticated + summary: listStores refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: list-stores + operationId: $sourceDescriptions.default.listStores + parameters: + - name: sellerId + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: list-user-products + summary: User products + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: user-products + operationId: $sourceDescriptions.default.listUserProducts + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: list-user-products-query-parameters + summary: listUserProducts with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: list-user-products + operationId: $sourceDescriptions.default.listUserProducts + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: list-user-products-unauthenticated + summary: listUserProducts refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: list-user-products + operationId: $sourceDescriptions.default.listUserProducts + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: purchase-product-listing-unauthenticated + summary: purchaseProductListing refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: purchase-product-listing + operationId: $sourceDescriptions.default.purchaseProductListing + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-product-unauthenticated + summary: updateProduct refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-product + operationId: $sourceDescriptions.default.updateProduct + parameters: + - name: productId + in: path + value: prod_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-product-listing-direct-unauthenticated + summary: updateProductListingDirect refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-product-listing-direct + operationId: $sourceDescriptions.default.updateProductListingDirect + parameters: + - name: productId + in: path + value: prod_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-tilia-tos + summary: Accepting the Tilia terms is withdrawn + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-tilia-tos + operationId: $sourceDescriptions.default.updateTiliaTos + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 404 + + - workflowId: update-tilia-tos-not-found + summary: updateTiliaTos refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-tilia-tos + operationId: $sourceDescriptions.default.updateTiliaTos + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + accepted: false + successCriteria: + - condition: $statusCode == 404 + + - workflowId: favorite-groups + summary: Rename a favorite group, confirm it applied, restore the name + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: groups + operationId: $sourceDescriptions.default.getFavoriteGroups + successCriteria: + - condition: $statusCode == 200 + + - stepId: group-before + operationId: $sourceDescriptions.default.getFavoriteGroup + parameters: + - name: favoriteGroupType + in: path + value: avatar + - name: favoriteGroupName + in: path + value: avatars2 + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/name == 'avatars2' + + outputs: + visibility: $response.body#/visibility + tags: $response.body#/tags + + - stepId: rename-group + operationId: $sourceDescriptions.default.updateFavoriteGroup + parameters: + - name: favoriteGroupType + in: path + value: avatar + - name: favoriteGroupName + in: path + value: avatars2 + - name: userId + in: path + value: $workflows.session.outputs.userId + requestBody: + contentType: application/json + payload: + displayName: conformance-renamed + visibility: public + tags: $steps.group-before.outputs.tags + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-renamed + operationId: $sourceDescriptions.default.getFavoriteGroup + parameters: + - name: favoriteGroupType + in: path + value: avatar + - name: favoriteGroupName + in: path + value: avatars2 + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/displayName == 'conformance-renamed' + - condition: $response.body#/visibility == 'public' + + - stepId: restore-group-name + operationId: $sourceDescriptions.default.updateFavoriteGroup + parameters: + - name: favoriteGroupType + in: path + value: avatar + - name: favoriteGroupName + in: path + value: avatars2 + - name: userId + in: path + value: $workflows.session.outputs.userId + requestBody: + contentType: application/json + payload: + displayName: avatars2 + visibility: $steps.group-before.outputs.visibility + tags: $steps.group-before.outputs.tags + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-restored + operationId: $sourceDescriptions.default.getFavoriteGroup + parameters: + - name: favoriteGroupType + in: path + value: avatar + - name: favoriteGroupName + in: path + value: avatars2 + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/displayName == 'avatars2' + - condition: $response.body#/visibility == $steps.group-before.outputs.visibility + + - workflowId: get-favorite-groups-query-parameters + summary: getFavoriteGroups with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-favorite-groups + operationId: $sourceDescriptions.default.getFavoriteGroups + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorite-groups-type-query-parameters + summary: getFavoriteGroups filtered by favourite type + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: favorite-groups-type + operationId: $sourceDescriptions.default.getFavoriteGroups + parameters: + - name: type + in: query + value: avatar + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/type == 'avatar' + + - workflowId: get-favorite-groups-unauthenticated + summary: getFavoriteGroups refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-favorite-groups + operationId: $sourceDescriptions.default.getFavoriteGroups + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-favorite-limits-unauthenticated + summary: getFavoriteLimits refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-favorite-limits + operationId: $sourceDescriptions.default.getFavoriteLimits + successCriteria: + - condition: $statusCode == 401 + + - workflowId: favorite-lifecycle + summary: Add a favorite, confirm it is listed, remove it, confirm it is gone + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: world-favorites + operationId: $sourceDescriptions.default.getFavorites + parameters: + - name: type + in: query + value: world + successCriteria: + - condition: $statusCode == 200 + + - stepId: add-favorite + operationId: $sourceDescriptions.default.addFavorite + requestBody: + contentType: application/json + payload: + favoriteId: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + tags: + - avatars2 + type: avatar + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/favoriteId == + 'avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11' + onFailure: + - name: stop + type: end + + outputs: + favoriteId: $response.body#/id + + - stepId: verify-favorite-listed + operationId: $sourceDescriptions.default.getFavorites + parameters: + - name: type + in: query + value: avatar + - name: tag + in: query + value: avatars2 + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/favoriteId == + 'avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11' + - condition: $response.body#/0/type == 'avatar' + + - stepId: add-duplicate-favorite + operationId: $sourceDescriptions.default.addFavorite + requestBody: + contentType: application/json + payload: + favoriteId: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + tags: + - avatars2 + type: avatar + successCriteria: + - condition: $statusCode == 400 + + - stepId: remove-favorite + operationId: $sourceDescriptions.default.removeFavorite + parameters: + - name: favoriteId + in: path + value: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-favorite-removed + operationId: $sourceDescriptions.default.removeFavorite + parameters: + - name: favoriteId + in: path + value: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + successCriteria: + - condition: $statusCode == 404 + + - stepId: remove-unknown-favorite + operationId: $sourceDescriptions.default.removeFavorite + parameters: + - name: favoriteId + in: path + value: avtr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 404 + + - stepId: favorite-limits + operationId: $sourceDescriptions.default.getFavoriteLimits + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorites-query-parameters + summary: getFavorites with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-favorites + operationId: $sourceDescriptions.default.getFavorites + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorites-unauthenticated + summary: getFavorites refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-favorites + operationId: $sourceDescriptions.default.getFavorites + successCriteria: + - condition: $statusCode == 401 + + - workflowId: remove-favorite-not-found + summary: removeFavorite refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: remove-favorite + operationId: $sourceDescriptions.default.removeFavorite + parameters: + - name: favoriteId + in: path + value: fvrt_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 400 + + - workflowId: remove-favorite-unauthenticated + summary: removeFavorite refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: remove-favorite + operationId: $sourceDescriptions.default.removeFavorite + parameters: + - name: favoriteId + in: path + value: fvrt_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-file-not-found + summary: deleteFile refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-file + operationId: $sourceDescriptions.default.deleteFile + parameters: + - name: fileId + in: path + value: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: download-file-version-not-found + summary: downloadFileVersion refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: download-file-version + operationId: $sourceDescriptions.default.downloadFileVersion + parameters: + - name: fileId + in: path + value: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-file-not-found + summary: getFile refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-file + operationId: $sourceDescriptions.default.getFile + parameters: + - name: fileId + in: path + value: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-file-analysis + summary: Analysis + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: analysis + operationId: $sourceDescriptions.default.getFileAnalysis + parameters: + - name: fileId + in: path + value: file_989feccd-3e6d-41f6-bf87-a8b3ece88438 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-file-analysis-not-found + summary: getFileAnalysis refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-file-analysis + operationId: $sourceDescriptions.default.getFileAnalysis + parameters: + - name: fileId + in: path + value: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 202 + + - workflowId: get-file-analysis-security + summary: Analysis security + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: analysis-security + operationId: $sourceDescriptions.default.getFileAnalysisSecurity + parameters: + - name: fileId + in: path + value: file_989feccd-3e6d-41f6-bf87-a8b3ece88438 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-file-analysis-security-not-found + summary: getFileAnalysisSecurity refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-file-analysis-security + operationId: $sourceDescriptions.default.getFileAnalysisSecurity + parameters: + - name: fileId + in: path + value: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 202 + + - workflowId: get-file-analysis-standard + summary: Analysis standard + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: analysis-standard + operationId: $sourceDescriptions.default.getFileAnalysisStandard + parameters: + - name: fileId + in: path + value: file_989feccd-3e6d-41f6-bf87-a8b3ece88438 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-file-analysis-standard-not-found + summary: getFileAnalysisStandard refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-file-analysis-standard + operationId: $sourceDescriptions.default.getFileAnalysisStandard + parameters: + - name: fileId + in: path + value: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 202 + - workflowId: files-lifecycle + summary: Creates, versions and deletes a real file on the account + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: files-before + operationId: $sourceDescriptions.default.getFiles + parameters: + - name: tag + in: query + value: gallery + successCriteria: + - condition: $statusCode == 200 + + - stepId: create-file + operationId: $sourceDescriptions.default.createFile + requestBody: + contentType: application/json + payload: + extension: A + mimeType: image/jpeg + name: string + tags: + - gallery + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + fileId: $response.body#/id + + - stepId: files-after-create + operationId: $sourceDescriptions.default.getFiles + parameters: + - name: tag + in: query + value: gallery + successCriteria: + - condition: $statusCode == 200 + + - stepId: get-file + operationId: $sourceDescriptions.default.getFile + parameters: + - name: fileId + in: path + value: $steps.create-file.outputs.fileId + successCriteria: + - condition: $statusCode == 200 + + - stepId: download-empty-version + operationId: $sourceDescriptions.default.downloadFileVersion + parameters: + - name: fileId + in: path + value: $steps.create-file.outputs.fileId + - name: versionId + in: path + value: 0 + successCriteria: + - condition: $statusCode == 404 + + - stepId: create-file-version + operationId: $sourceDescriptions.default.createFileVersion + parameters: + - name: fileId + in: path + value: $steps.create-file.outputs.fileId + requestBody: + contentType: application/json + payload: + fileMd5: dGVzdA== + fileSizeInBytes: 64 + signatureMd5: dGVzdA== + signatureSizeInBytes: 64 + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-file-version + operationId: $sourceDescriptions.default.deleteFileVersion + parameters: + - name: fileId + in: path + value: $steps.create-file.outputs.fileId + - name: versionId + in: path + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-file + operationId: $sourceDescriptions.default.deleteFile + parameters: + - name: fileId + in: path + value: $steps.create-file.outputs.fileId + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-file-deleted + operationId: $sourceDescriptions.default.getFile + parameters: + - name: fileId + in: path + value: $steps.create-file.outputs.fileId + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-files-query-parameters + summary: getFiles with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-files + operationId: $sourceDescriptions.default.getFiles + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: submit-content-agreement-unauthenticated + summary: submitContentAgreement refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: submit-content-agreement + operationId: $sourceDescriptions.default.submitContentAgreement + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-asset-review-notes-unauthenticated + summary: updateAssetReviewNotes refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-asset-review-notes + operationId: $sourceDescriptions.default.updateAssetReviewNotes + parameters: + - name: assetReviewId + in: path + value: arev_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: boop-not-found + summary: boop refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: boop + operationId: $sourceDescriptions.default.boop + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 400 + + - workflowId: delete-friend-request-not-found + summary: deleteFriendRequest refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-friend-request + operationId: $sourceDescriptions.default.deleteFriendRequest + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: delete-friend-request-unauthenticated + summary: deleteFriendRequest refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-friend-request + operationId: $sourceDescriptions.default.deleteFriendRequest + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: friend-unauthenticated + summary: friend refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: friend + operationId: $sourceDescriptions.default.friend + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + - workflowId: friend-request-lifecycle + summary: Send a friend request, confirm it is outgoing, withdraw it + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: status-before + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/isFriend == false + - condition: $response.body#/outgoingRequest == false + + - stepId: send-request + operationId: $sourceDescriptions.default.friend + parameters: + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-outgoing + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/outgoingRequest == true + + - stepId: delete-request + operationId: $sourceDescriptions.default.deleteFriendRequest + parameters: + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-withdrawn + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/outgoingRequest == false + + - workflowId: get-friend-status + summary: Friend status + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: friend-status + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/incomingRequest == false + + - workflowId: get-friend-status-self + summary: Friend status self + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: friend-status-self + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469 + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/isFriend == false + + - workflowId: get-friend-status-unauthenticated + summary: getFriendStatus refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-friend-status + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-friend-status-unknown + summary: Friend status unknown + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: friend-status-unknown + operationId: $sourceDescriptions.default.getFriendStatus + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/isFriend == false + + - workflowId: get-friends-offline + summary: Friends offline + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: friends-offline + operationId: $sourceDescriptions.default.getFriends + parameters: + - name: offline + in: query + value: true + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-friends-online + summary: Friends online + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: friends-online + operationId: $sourceDescriptions.default.getFriends + parameters: + - name: offline + in: query + value: false + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-friends-query-parameters + summary: getFriends with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-friends + operationId: $sourceDescriptions.default.getFriends + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-friends-unauthenticated + summary: getFriends refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-friends + operationId: $sourceDescriptions.default.getFriends + successCriteria: + - condition: $statusCode == 401 + + - workflowId: unfriend-unauthenticated + summary: unfriend refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: unfriend + operationId: $sourceDescriptions.default.unfriend + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: add-group-gallery-image-not-found + summary: addGroupGalleryImage refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: add-group-gallery-image + operationId: $sourceDescriptions.default.addGroupGalleryImage + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupGalleryId + in: path + value: ggal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + fileId: file_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: add-group-gallery-image-unauthenticated + summary: addGroupGalleryImage refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: add-group-gallery-image + operationId: $sourceDescriptions.default.addGroupGalleryImage + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupGalleryId + in: path + value: ggal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: add-group-member-role-not-found + summary: addGroupMemberRole refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: add-group-member-role + operationId: $sourceDescriptions.default.addGroupMemberRole + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupRoleId + in: path + value: grol_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: add-group-member-role-unauthenticated + summary: addGroupMemberRole refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: add-group-member-role + operationId: $sourceDescriptions.default.addGroupMemberRole + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: groupRoleId + in: path + value: grol_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: add-group-post-unauthenticated + summary: addGroupPost refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: add-group-post + operationId: $sourceDescriptions.default.addGroupPost + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: ban-group-member-not-found + summary: banGroupMember refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: ban-group-member + operationId: $sourceDescriptions.default.banGroupMember + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + userId: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: ban-group-member-unauthenticated + summary: banGroupMember refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: ban-group-member + operationId: $sourceDescriptions.default.banGroupMember + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: block-group-not-found + summary: blockGroup refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: block-group + operationId: $sourceDescriptions.default.blockGroup + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: block-group-unauthenticated + summary: blockGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: block-group + operationId: $sourceDescriptions.default.blockGroup + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: cancel-group-request-not-found + summary: cancelGroupRequest refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: cancel-group-request + operationId: $sourceDescriptions.default.cancelGroupRequest + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: cancel-group-transfer-not-found + summary: cancelGroupTransfer refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: cancel-group-transfer + operationId: $sourceDescriptions.default.cancelGroupTransfer + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: cancel-group-transfer-unauthenticated + summary: cancelGroupTransfer refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: cancel-group-transfer + operationId: $sourceDescriptions.default.cancelGroupTransfer + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: create-group-unauthenticated + summary: createGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-group + operationId: $sourceDescriptions.default.createGroup + successCriteria: + - condition: $statusCode == 401 + + - workflowId: group-lifecycle + summary: Creates, updates and deletes a real group on the account + inputs: + type: object + required: + - friendId + properties: + friendId: + type: string + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: short-code + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - openssl rand -hex 2 | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: create-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.createGroup + requestBody: + contentType: application/json + payload: + name: Test + roleTemplate: default + shortCode: $steps.short-code.outputs.value + description: Created by the conformance suite + joinState: closed + privacy: private + bannerId: null + iconId: null + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/name == 'Test' + - condition: $response.body#/description == 'Created by the conformance suite' + - condition: $response.body#/privacy == 'private' + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/id + + - stepId: get-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroup + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: group-members + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupMembers + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: update-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateGroup + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + requestBody: + contentType: application/json + payload: + joinState: invite + name: Test 2 + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/name == 'Test 2' + + - stepId: verify-group-renamed + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroup + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/name == 'Test 2' + + - stepId: create-group-invite + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.createGroupInvite + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + requestBody: + contentType: application/json + payload: + userId: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + + - stepId: group-invites + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroupInvites + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/userId == $inputs.friendId + + - stepId: represent-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateGroupRepresentation + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + requestBody: + contentType: application/json + payload: + isRepresenting: true + successCriteria: + - condition: $statusCode == 200 + + - stepId: represent-foreign-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateGroupRepresentation + parameters: + - name: groupId + in: path + value: grp_0f1d4450-822e-45d5-b5aa-6a0ea8402053 + requestBody: + contentType: application/json + payload: + isRepresenting: false + successCriteria: + - condition: $statusCode == 403 + + - stepId: represent-invalid-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateGroupRepresentation + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + requestBody: + contentType: application/json + payload: + isRepresenting: false + successCriteria: + - condition: $statusCode == 403 + + - stepId: delete-group-invite + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.deleteGroupInvite + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + - name: userId + in: path + value: $inputs.friendId + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-group + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.deleteGroup + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-group-deleted + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getGroup + parameters: + - name: groupId + in: path + value: $steps.create-group.outputs.groupId + successCriteria: + - condition: $statusCode == 404 + + - workflowId: create-group-announcement-not-found + summary: createGroupAnnouncement refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: create-group-announcement + operationId: $sourceDescriptions.default.createGroupAnnouncement + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + title: conformance + successCriteria: + - condition: $statusCode == 400 + + - workflowId: create-group-announcement-unauthenticated + summary: createGroupAnnouncement refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-group-announcement + operationId: $sourceDescriptions.default.createGroupAnnouncement + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: create-group-gallery-not-found + summary: createGroupGallery refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: create-group-gallery + operationId: $sourceDescriptions.default.createGroupGallery + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + name: conformance + successCriteria: + - condition: $statusCode == 403 + + - workflowId: create-group-gallery-unauthenticated + summary: createGroupGallery refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-group-gallery + operationId: $sourceDescriptions.default.createGroupGallery + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: create-group-invite-not-found + summary: createGroupInvite refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: create-group-invite + operationId: $sourceDescriptions.default.createGroupInvite + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + userId: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: create-group-invite-unauthenticated + summary: createGroupInvite refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-group-invite + operationId: $sourceDescriptions.default.createGroupInvite + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: create-group-role-not-found + summary: createGroupRole refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: create-group-role + operationId: $sourceDescriptions.default.createGroupRole + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: create-group-role-unauthenticated + summary: createGroupRole refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-group-role + operationId: $sourceDescriptions.default.createGroupRole + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: decline-group-invite-not-found + summary: declineGroupInvite refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: decline-group-invite + operationId: $sourceDescriptions.default.declineGroupInvite + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: decline-group-invite-unauthenticated + summary: declineGroupInvite refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: decline-group-invite + operationId: $sourceDescriptions.default.declineGroupInvite + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-not-found + summary: deleteGroup refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group + operationId: $sourceDescriptions.default.deleteGroup + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-group-unauthenticated + summary: deleteGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group + operationId: $sourceDescriptions.default.deleteGroup + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-announcement-not-found + summary: deleteGroupAnnouncement refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group-announcement + operationId: $sourceDescriptions.default.deleteGroupAnnouncement + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: delete-group-announcement-unauthenticated + summary: deleteGroupAnnouncement refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-announcement + operationId: $sourceDescriptions.default.deleteGroupAnnouncement + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-gallery-not-found + summary: deleteGroupGallery refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group-gallery + operationId: $sourceDescriptions.default.deleteGroupGallery + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupGalleryId + in: path + value: ggal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: delete-group-gallery-unauthenticated + summary: deleteGroupGallery refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-gallery + operationId: $sourceDescriptions.default.deleteGroupGallery + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupGalleryId + in: path + value: ggal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-gallery-image-not-found + summary: deleteGroupGalleryImage refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group-gallery-image + operationId: $sourceDescriptions.default.deleteGroupGalleryImage + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupGalleryId + in: path + value: ggal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupGalleryImageId + in: path + value: ggim_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-group-gallery-image-unauthenticated + summary: deleteGroupGalleryImage refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-gallery-image + operationId: $sourceDescriptions.default.deleteGroupGalleryImage + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupGalleryId + in: path + value: ggal_00000000-0000-0000-0000-000000000000 + - name: groupGalleryImageId + in: path + value: ggim_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-invite-unauthenticated + summary: deleteGroupInvite refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-invite + operationId: $sourceDescriptions.default.deleteGroupInvite + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-post-not-found + summary: deleteGroupPost refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group-post + operationId: $sourceDescriptions.default.deleteGroupPost + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: delete-group-post-unauthenticated + summary: deleteGroupPost refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-post + operationId: $sourceDescriptions.default.deleteGroupPost + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-group-role-not-found + summary: deleteGroupRole refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-group-role + operationId: $sourceDescriptions.default.deleteGroupRole + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupRoleId + in: path + value: grol_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: delete-group-role-unauthenticated + summary: deleteGroupRole refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-group-role + operationId: $sourceDescriptions.default.deleteGroupRole + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupRoleId + in: path + value: grol_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-not-found + summary: getGroup refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group + operationId: $sourceDescriptions.default.getGroup + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-group-unauthenticated + summary: getGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group + operationId: $sourceDescriptions.default.getGroup + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-announcements-not-found + summary: getGroupAnnouncements refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-announcements + operationId: $sourceDescriptions.default.getGroupAnnouncements + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-announcements-unauthenticated + summary: getGroupAnnouncements refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-announcements + operationId: $sourceDescriptions.default.getGroupAnnouncements + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-audit-log-entry-types-not-found + summary: getGroupAuditLogEntryTypes refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-audit-log-entry-types + operationId: $sourceDescriptions.default.getGroupAuditLogEntryTypes + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-audit-log-entry-types-unauthenticated + summary: getGroupAuditLogEntryTypes refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-audit-log-entry-types + operationId: $sourceDescriptions.default.getGroupAuditLogEntryTypes + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-audit-logs-not-found + summary: getGroupAuditLogs refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-audit-logs + operationId: $sourceDescriptions.default.getGroupAuditLogs + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-audit-logs-unauthenticated + summary: getGroupAuditLogs refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-audit-logs + operationId: $sourceDescriptions.default.getGroupAuditLogs + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-bans-not-found + summary: getGroupBans refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-bans + operationId: $sourceDescriptions.default.getGroupBans + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-bans-unauthenticated + summary: getGroupBans refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-bans + operationId: $sourceDescriptions.default.getGroupBans + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-gallery-images-not-found + summary: getGroupGalleryImages refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-gallery-images + operationId: $sourceDescriptions.default.getGroupGalleryImages + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupGalleryId + in: path + value: ggal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-group-gallery-images-unauthenticated + summary: getGroupGalleryImages refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-gallery-images + operationId: $sourceDescriptions.default.getGroupGalleryImages + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupGalleryId + in: path + value: ggal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-instances-not-found + summary: getGroupInstances refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-instances + operationId: $sourceDescriptions.default.getGroupInstances + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-instances-unauthenticated + summary: getGroupInstances refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-instances + operationId: $sourceDescriptions.default.getGroupInstances + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-invites-not-found + summary: getGroupInvites refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-invites + operationId: $sourceDescriptions.default.getGroupInvites + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-invites-unauthenticated + summary: getGroupInvites refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-invites + operationId: $sourceDescriptions.default.getGroupInvites + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-member-not-found + summary: getGroupMember refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-member + operationId: $sourceDescriptions.default.getGroupMember + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-member-unauthenticated + summary: getGroupMember refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-member + operationId: $sourceDescriptions.default.getGroupMember + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-members-unauthenticated + summary: getGroupMembers refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-members + operationId: $sourceDescriptions.default.getGroupMembers + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-permissions-not-found + summary: getGroupPermissions refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-permissions + operationId: $sourceDescriptions.default.getGroupPermissions + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-permissions-unauthenticated + summary: getGroupPermissions refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-permissions + operationId: $sourceDescriptions.default.getGroupPermissions + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-posts-unauthenticated + summary: getGroupPosts refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-posts + operationId: $sourceDescriptions.default.getGroupPosts + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-requests-not-found + summary: getGroupRequests refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-requests + operationId: $sourceDescriptions.default.getGroupRequests + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-role-templates + summary: Group role templates + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: group-role-templates + operationId: $sourceDescriptions.default.getGroupRoleTemplates + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-group-role-templates-unauthenticated + summary: getGroupRoleTemplates refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-role-templates + operationId: $sourceDescriptions.default.getGroupRoleTemplates + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-roles-not-found + summary: getGroupRoles refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-roles + operationId: $sourceDescriptions.default.getGroupRoles + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-roles-unauthenticated + summary: getGroupRoles refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-roles + operationId: $sourceDescriptions.default.getGroupRoles + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-group-transferability-not-found + summary: getGroupTransferability refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-group-transferability + operationId: $sourceDescriptions.default.getGroupTransferability + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-group-transferability-unauthenticated + summary: getGroupTransferability refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-group-transferability + operationId: $sourceDescriptions.default.getGroupTransferability + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: group-announcement-lifecycle + summary: Create a group announcement, then delete it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: create-announcement + operationId: $sourceDescriptions.default.createGroupAnnouncement + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + title: Conformance + text: Created by the conformance suite + sendNotification: false + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + - stepId: delete-announcement + operationId: $sourceDescriptions.default.deleteGroupAnnouncement + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: group-gallery-lifecycle + summary: Create a group gallery, update it, delete it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: create-gallery + operationId: $sourceDescriptions.default.createGroupGallery + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + name: conformance + description: Created by the conformance suite + membersOnly: true + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + galleryId: $response.body#/id + + - stepId: update-gallery + operationId: $sourceDescriptions.default.updateGroupGallery + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: groupGalleryId + in: path + value: $steps.create-gallery.outputs.galleryId + requestBody: + contentType: application/json + payload: + name: conformance-renamed + membersOnly: false + successCriteria: + - condition: $statusCode == 200 + + - stepId: gallery-images + operationId: $sourceDescriptions.default.getGroupGalleryImages + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: groupGalleryId + in: path + value: $steps.create-gallery.outputs.galleryId + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-gallery + operationId: $sourceDescriptions.default.deleteGroupGallery + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: groupGalleryId + in: path + value: $steps.create-gallery.outputs.galleryId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: group-member-role + summary: Grant a role to the owner, then take it away + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: create-role + operationId: $sourceDescriptions.default.createGroupRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + name: conformance-member-role + description: Created by the conformance suite + isSelfAssignable: false + permissions: + - group-instance-join + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + roleId: $response.body#/id + + - stepId: add-member-role + operationId: $sourceDescriptions.default.addGroupMemberRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: groupRoleId + in: path + value: $steps.create-role.outputs.roleId + successCriteria: + - condition: $statusCode == 200 + + - stepId: remove-member-role + operationId: $sourceDescriptions.default.removeGroupMemberRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: groupRoleId + in: path + value: $steps.create-role.outputs.roleId + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-role + operationId: $sourceDescriptions.default.deleteGroupRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: groupRoleId + in: path + value: $steps.create-role.outputs.roleId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: group-post-lifecycle + summary: Create a group post, update it, delete it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: create-post + operationId: $sourceDescriptions.default.addGroupPost + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + title: Conformance + text: Created by the conformance suite + sendNotification: false + visibility: group + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + postId: $response.body#/id + + - stepId: update-post + operationId: $sourceDescriptions.default.updateGroupPost + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: notificationId + in: path + value: $steps.create-post.outputs.postId + requestBody: + contentType: application/json + payload: + title: Conformance renamed + text: Updated by the conformance suite + sendNotification: false + visibility: group + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-post + operationId: $sourceDescriptions.default.deleteGroupPost + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: notificationId + in: path + value: $steps.create-post.outputs.postId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: group-reads + summary: Group reads against an existing membership + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: group + operationId: $sourceDescriptions.default.getGroup + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: announcements + operationId: $sourceDescriptions.default.getGroupAnnouncements + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: audit-log-types + operationId: $sourceDescriptions.default.getGroupAuditLogEntryTypes + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: audit-logs + operationId: $sourceDescriptions.default.getGroupAuditLogs + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: bans + operationId: $sourceDescriptions.default.getGroupBans + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: instances + operationId: $sourceDescriptions.default.getGroupInstances + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: invites + operationId: $sourceDescriptions.default.getGroupInvites + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: members + operationId: $sourceDescriptions.default.getGroupMembers + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: search-members + operationId: $sourceDescriptions.default.searchGroupMembers + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: query + in: query + value: test + successCriteria: + - condition: $statusCode == 200 + + - stepId: member + operationId: $sourceDescriptions.default.getGroupMember + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - stepId: permissions + operationId: $sourceDescriptions.default.getGroupPermissions + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: posts + operationId: $sourceDescriptions.default.getGroupPosts + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: requests + operationId: $sourceDescriptions.default.getGroupRequests + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: roles + operationId: $sourceDescriptions.default.getGroupRoles + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - stepId: transferability + operationId: $sourceDescriptions.default.getGroupTransferability + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: group-role-lifecycle + summary: Create a group role, update it, delete it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: create-role + operationId: $sourceDescriptions.default.createGroupRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + name: conformance + description: Created by the conformance suite + isSelfAssignable: false + permissions: + - group-instance-join + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/name == 'conformance' + onFailure: + - name: stop + type: end + + outputs: + roleId: $response.body#/id + + - stepId: update-role + operationId: $sourceDescriptions.default.updateGroupRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: groupRoleId + in: path + value: $steps.create-role.outputs.roleId + requestBody: + contentType: application/json + payload: + name: conformance-renamed + description: Updated by the conformance suite + successCriteria: + - condition: $statusCode == 200 + + - stepId: delete-role + operationId: $sourceDescriptions.default.deleteGroupRole + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + - name: groupRoleId + in: path + value: $steps.create-role.outputs.roleId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: group-update + summary: Rename the group, confirm it applied, restore the name + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + name: $response.body#/0/name + + - stepId: rename + operationId: $sourceDescriptions.default.updateGroup + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + description: Renamed by the conformance suite + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/description == 'Renamed by the conformance suite' + + - stepId: restore + operationId: $sourceDescriptions.default.updateGroup + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + description: "" + successCriteria: + - condition: $statusCode == 200 + + - workflowId: initiate-or-accept-group-transfer-not-found + summary: initiateOrAcceptGroupTransfer refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: initiate-or-accept-group-transfer + operationId: $sourceDescriptions.default.initiateOrAcceptGroupTransfer + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: initiate-or-accept-group-transfer-unauthenticated + summary: initiateOrAcceptGroupTransfer refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: initiate-or-accept-group-transfer + operationId: $sourceDescriptions.default.initiateOrAcceptGroupTransfer + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: join-group-not-found + summary: joinGroup refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: join-group + operationId: $sourceDescriptions.default.joinGroup + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: join-group-unauthenticated + summary: joinGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: join-group + operationId: $sourceDescriptions.default.joinGroup + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: kick-group-member-not-found + summary: kickGroupMember refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: kick-group-member + operationId: $sourceDescriptions.default.kickGroupMember + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: kick-group-member-unauthenticated + summary: kickGroupMember refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: kick-group-member + operationId: $sourceDescriptions.default.kickGroupMember + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: leave-group-not-found + summary: leaveGroup refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: leave-group + operationId: $sourceDescriptions.default.leaveGroup + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: remove-group-member-role-not-found + summary: removeGroupMemberRole refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: remove-group-member-role + operationId: $sourceDescriptions.default.removeGroupMemberRole + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupRoleId + in: path + value: grol_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: remove-group-member-role-unauthenticated + summary: removeGroupMemberRole refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: remove-group-member-role + operationId: $sourceDescriptions.default.removeGroupMemberRole + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: groupRoleId + in: path + value: grol_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: respond-group-join-request-not-found + summary: respondGroupJoinRequest refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: respond-group-join-request + operationId: $sourceDescriptions.default.respondGroupJoinRequest + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + action: accept + successCriteria: + - condition: $statusCode == 403 + + - workflowId: respond-group-join-request-unauthenticated + summary: respondGroupJoinRequest refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: respond-group-join-request + operationId: $sourceDescriptions.default.respondGroupJoinRequest + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: search-group-members-unauthenticated + summary: searchGroupMembers refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: search-group-members + operationId: $sourceDescriptions.default.searchGroupMembers + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: query + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: search-groups + summary: Search groups + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-groups + operationId: $sourceDescriptions.default.searchGroups + parameters: + - name: query + in: query + value: vrchat + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-groups-query-parameters + summary: searchGroups with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-groups + operationId: $sourceDescriptions.default.searchGroups + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-groups-unauthenticated + summary: searchGroups refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: search-groups + operationId: $sourceDescriptions.default.searchGroups + successCriteria: + - condition: $statusCode == 401 + + - workflowId: unban-group-member-not-found + summary: unbanGroupMember refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: unban-group-member + operationId: $sourceDescriptions.default.unbanGroupMember + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: unban-group-member-unauthenticated + summary: unbanGroupMember refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: unban-group-member + operationId: $sourceDescriptions.default.unbanGroupMember + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-group-not-found + summary: updateGroup refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-group + operationId: $sourceDescriptions.default.updateGroup + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 400 + + - workflowId: update-group-gallery-not-found + summary: updateGroupGallery refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-group-gallery + operationId: $sourceDescriptions.default.updateGroupGallery + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: groupGalleryId + in: path + value: ggal_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: update-group-gallery-unauthenticated + summary: updateGroupGallery refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-group-gallery + operationId: $sourceDescriptions.default.updateGroupGallery + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupGalleryId + in: path + value: ggal_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-group-member-not-found + summary: updateGroupMember refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-group-member + operationId: $sourceDescriptions.default.updateGroupMember + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: update-group-member-unauthenticated + summary: updateGroupMember refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-group-member + operationId: $sourceDescriptions.default.updateGroupMember + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-group-post-not-found + summary: updateGroupPost refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-group-post + operationId: $sourceDescriptions.default.updateGroupPost + parameters: + - name: groupId + in: path + value: grp_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + sendNotification: false + text: conformance + title: conformance + visibility: group + successCriteria: + - condition: $statusCode == 403 + + - workflowId: update-group-post-unauthenticated + summary: updateGroupPost refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-group-post + operationId: $sourceDescriptions.default.updateGroupPost + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-group-representation-unauthenticated + summary: updateGroupRepresentation refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-group-representation + operationId: $sourceDescriptions.default.updateGroupRepresentation + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-group-role-unauthenticated + summary: updateGroupRole refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-group-role + operationId: $sourceDescriptions.default.updateGroupRole + parameters: + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + - name: groupRoleId + in: path + value: grol_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: close-instance-not-found + summary: closeInstance refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: close-instance + operationId: $sourceDescriptions.default.closeInstance + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: instanceId + in: path + value: id_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: close-instance-unauthenticated + summary: closeInstance refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: close-instance + operationId: $sourceDescriptions.default.closeInstance + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + - name: instanceId + in: path + value: 0 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: instance-lifecycle + summary: Creates a real private instance, then invites the account to it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: create-instance + operationId: $sourceDescriptions.default.createInstance + requestBody: + contentType: application/json + payload: + worldId: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + type: private + region: use + ownerId: $workflows.session.outputs.userId + canRequestInvite: true + ageGate: false + displayName: conformance + hardClose: false + inviteOnly: false + queueEnabled: false + instancePersistenceEnabled: false + playerPersistenceEnabled: false + closedAt: "2099-01-01T00:00:00.000Z" + contentSettings: + drones: true + emoji: true + pedestals: true + prints: true + props: true + stickers: true + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + instanceId: $response.body#/instanceId + + - stepId: invite-myself + operationId: $sourceDescriptions.default.inviteMyselfTo + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: $steps.create-instance.outputs.instanceId + successCriteria: + - condition: $statusCode == 200 + + - stepId: create-instance-null-display-name + operationId: $sourceDescriptions.default.createInstance + requestBody: + contentType: application/json + payload: + worldId: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + type: private + region: use + ownerId: $workflows.session.outputs.userId + displayName: null + successCriteria: + - condition: $statusCode == 400 + + - workflowId: get-instance + summary: Instance lookup needs no session + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: instance + operationId: $sourceDescriptions.default.getInstance + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: "0" + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-instance-by-short-name-not-found + summary: getInstanceByShortName refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-instance-by-short-name + operationId: $sourceDescriptions.default.getInstanceByShortName + parameters: + - name: shortName + in: path + value: conformance + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-recent-locations + summary: Recent locations + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: recent-locations + operationId: $sourceDescriptions.default.getRecentLocations + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-recent-locations-query-parameters + summary: getRecentLocations with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-recent-locations + operationId: $sourceDescriptions.default.getRecentLocations + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-recent-locations-unauthenticated + summary: getRecentLocations refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-recent-locations + operationId: $sourceDescriptions.default.getRecentLocations + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-short-name + summary: Instance short name needs no session + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: short-name + operationId: $sourceDescriptions.default.getShortName + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: "0" + successCriteria: + - condition: $statusCode == 200 + - workflowId: world-instance-lifecycle + summary: Instance lookups derived from a live world + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: black-cat + operationId: $sourceDescriptions.default.getWorld + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + instanceId: $response.body#/instances/0/0 + + - stepId: world-instance + operationId: $sourceDescriptions.default.getWorldInstance + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: $steps.black-cat.outputs.instanceId + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + secureName: $response.body#/secureName + + - stepId: instance + operationId: $sourceDescriptions.default.getInstance + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: $steps.black-cat.outputs.instanceId + successCriteria: + - condition: $statusCode == 200 + + - stepId: short-name + operationId: $sourceDescriptions.default.getShortName + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: $steps.black-cat.outputs.instanceId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/secureName == + $steps.world-instance.outputs.secureName + + - stepId: instance-by-short-name + operationId: $sourceDescriptions.default.getInstanceByShortName + parameters: + - name: shortName + in: path + value: $steps.world-instance.outputs.secureName + successCriteria: + - condition: $statusCode == 200 + + - workflowId: consume-own-inventory-item-unauthenticated + summary: consumeOwnInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: consume-own-inventory-item + operationId: $sourceDescriptions.default.consumeOwnInventoryItem + parameters: + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-own-inventory-item-unauthenticated + summary: deleteOwnInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-own-inventory-item + operationId: $sourceDescriptions.default.deleteOwnInventoryItem + parameters: + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: equip-own-inventory-item-unauthenticated + summary: equipOwnInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: equip-own-inventory-item + operationId: $sourceDescriptions.default.equipOwnInventoryItem + parameters: + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-inventory-query-parameters + summary: getInventory with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-inventory + operationId: $sourceDescriptions.default.getInventory + parameters: + - name: archived + in: query + value: false + - name: equipSlot + in: query + value: "" + - name: flags + in: query + value: archivable + - name: notFlags + in: query + value: archivable + - name: notTypes + in: query + value: bundle + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-inventory-unauthenticated + summary: getInventory refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-inventory + operationId: $sourceDescriptions.default.getInventory + successCriteria: + - condition: $statusCode == 401 + - workflowId: inventory-item-reads + summary: Reads the oldest owned prop, then fetches it by id + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: list + operationId: $sourceDescriptions.default.getInventory + parameters: + - name: n + in: query + value: 100 + - name: offset + in: query + value: 0 + - name: order + in: query + value: oldest + - name: types + in: query + value: prop + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/data/0/metadata/propId == + 'prop_49fec698-f0cb-475c-9bc3-8f24e1bcc4eb' + onFailure: + - name: stop + type: end + + outputs: + inventoryItemId: $response.body#/data/0/id + + - stepId: own-item + operationId: $sourceDescriptions.default.getOwnInventoryItem + parameters: + - name: inventoryItemId + in: path + value: $steps.list.outputs.inventoryItemId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-inventory-collections + summary: Inventory collections + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: inventory-collections + operationId: $sourceDescriptions.default.getInventoryCollections + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-inventory-collections-unauthenticated + summary: getInventoryCollections refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-inventory-collections + operationId: $sourceDescriptions.default.getInventoryCollections + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-inventory-drops + summary: Drops + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: drops + operationId: $sourceDescriptions.default.getInventoryDrops + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-inventory-drops-query-parameters + summary: getInventoryDrops with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-inventory-drops + operationId: $sourceDescriptions.default.getInventoryDrops + parameters: + - name: active + in: query + value: false + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-inventory-drops-unauthenticated + summary: getInventoryDrops refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-inventory-drops + operationId: $sourceDescriptions.default.getInventoryDrops + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-inventory-template + summary: Template + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: template + operationId: $sourceDescriptions.default.getInventoryTemplate + parameters: + - name: inventoryTemplateId + in: path + value: invt_1f11aa73-8f05-4d50-a1a8-c59074d03ce2 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-inventory-template-unauthenticated + summary: getInventoryTemplate refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-inventory-template + operationId: $sourceDescriptions.default.getInventoryTemplate + parameters: + - name: inventoryTemplateId + in: path + value: invt_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-own-inventory-item-unauthenticated + summary: getOwnInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-own-inventory-item + operationId: $sourceDescriptions.default.getOwnInventoryItem + parameters: + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-inventory-item-unauthenticated + summary: getUserInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-inventory-item + operationId: $sourceDescriptions.default.getUserInventoryItem + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: redeem-reward-unauthenticated + summary: redeemReward refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: redeem-reward + operationId: $sourceDescriptions.default.redeemReward + successCriteria: + - condition: $statusCode == 401 + + - workflowId: share-inventory-item-direct-unauthenticated + summary: shareInventoryItemDirect refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: share-inventory-item-direct + operationId: $sourceDescriptions.default.shareInventoryItemDirect + parameters: + - name: itemId + in: query + value: id_00000000-0000-0000-0000-000000000000 + - name: duration + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: share-inventory-item-pedestal-unauthenticated + summary: shareInventoryItemPedestal refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: share-inventory-item-pedestal + operationId: $sourceDescriptions.default.shareInventoryItemPedestal + parameters: + - name: itemId + in: query + value: id_00000000-0000-0000-0000-000000000000 + - name: duration + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: spawn-inventory-item + summary: Spawn + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: spawn + operationId: $sourceDescriptions.default.spawnInventoryItem + parameters: + - name: id + in: query + value: default_money + successCriteria: + - condition: $statusCode == 200 + + - workflowId: spawn-inventory-item-unauthenticated + summary: spawnInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: spawn-inventory-item + operationId: $sourceDescriptions.default.spawnInventoryItem + parameters: + - name: id + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: unequip-own-inventory-slot-unauthenticated + summary: unequipOwnInventorySlot refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: unequip-own-inventory-slot + operationId: $sourceDescriptions.default.unequipOwnInventorySlot + parameters: + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-own-inventory-item-unauthenticated + summary: updateOwnInventoryItem refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-own-inventory-item + operationId: $sourceDescriptions.default.updateOwnInventoryItem + parameters: + - name: inventoryItemId + in: path + value: inv_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-invite-message + summary: Message + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: message + operationId: $sourceDescriptions.default.getInviteMessage + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-invite-message-not-found + summary: getInviteMessage refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-invite-message + operationId: $sourceDescriptions.default.getInviteMessage + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-invite-message-unauthenticated + summary: getInviteMessage refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-invite-message + operationId: $sourceDescriptions.default.getInviteMessage + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-invite-messages + summary: Messages + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: messages + operationId: $sourceDescriptions.default.getInviteMessages + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-invite-messages-unauthenticated + summary: getInviteMessages refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-invite-messages + operationId: $sourceDescriptions.default.getInviteMessages + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: messageType + in: path + value: message + successCriteria: + - condition: $statusCode == 401 + + - workflowId: invite-myself-to-not-found + summary: inviteMyselfTo refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: invite-myself-to + operationId: $sourceDescriptions.default.inviteMyselfTo + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: instanceId + in: path + value: id_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: invite-myself-to-unauthenticated + summary: inviteMyselfTo refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: invite-myself-to + operationId: $sourceDescriptions.default.inviteMyselfTo + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + - name: instanceId + in: path + value: 0 + successCriteria: + - condition: $statusCode == 401 + - workflowId: invite-message-lifecycle + summary: >- + Skipped by name in `pnpm conformance`: resetting or updating a message + slot locks it for roughly half an hour, so these cannot run on every pass. + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: reset-message + operationId: $sourceDescriptions.default.resetInviteMessage + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 200 + + - stepId: reset-message-rate-limited + operationId: $sourceDescriptions.default.resetInviteMessage + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 429 + + - stepId: update-message + operationId: $sourceDescriptions.default.updateInviteMessage + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + requestBody: + contentType: application/json + payload: + message: Hello, World! + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-message-updated + operationId: $sourceDescriptions.default.getInviteMessage + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/message == 'Hello, World!' + + - stepId: update-message-rate-limited + operationId: $sourceDescriptions.default.updateInviteMessage + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + requestBody: + contentType: application/json + payload: + message: I am speed! + successCriteria: + - condition: $statusCode == 429 + + - workflowId: reset-invite-message-not-found + summary: resetInviteMessage refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: reset-invite-message + operationId: $sourceDescriptions.default.resetInviteMessage + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: reset-invite-message-unauthenticated + summary: resetInviteMessage refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: reset-invite-message + operationId: $sourceDescriptions.default.resetInviteMessage + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-invite-message-unauthenticated + summary: updateInviteMessage refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-invite-message + operationId: $sourceDescriptions.default.updateInviteMessage + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: messageType + in: path + value: message + - name: slot + in: path + value: 0 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-jam-submission-not-found + summary: deleteJamSubmission refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-jam-submission + operationId: $sourceDescriptions.default.deleteJamSubmission + parameters: + - name: jamId + in: path + value: jam_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: jamSubmissionId + in: path + value: jsub_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-jam-submission-unauthenticated + summary: deleteJamSubmission refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-jam-submission + operationId: $sourceDescriptions.default.deleteJamSubmission + parameters: + - name: jamId + in: path + value: jam_00000000-0000-0000-0000-000000000000 + - name: jamSubmissionId + in: path + value: jsub_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-jam-not-found + summary: getJam refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-jam + operationId: $sourceDescriptions.default.getJam + parameters: + - name: jamId + in: path + value: jam_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-jams + summary: Jams + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: jams + operationId: $sourceDescriptions.default.getJams + successCriteria: + - condition: $statusCode == 200 + - workflowId: jam-reads + summary: Reads the first jam, then its submissions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: jams + operationId: $sourceDescriptions.default.getJams + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + jamId: $response.body#/0/id + + - stepId: jam + operationId: $sourceDescriptions.default.getJam + parameters: + - name: jamId + in: path + value: $steps.jams.outputs.jamId + successCriteria: + - condition: $statusCode == 200 + + - stepId: submissions + operationId: $sourceDescriptions.default.getJamSubmissions + parameters: + - name: jamId + in: path + value: $steps.jams.outputs.jamId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: submit-jam-content-not-found + summary: submitJamContent refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: submit-jam-content + operationId: $sourceDescriptions.default.submitJamContent + parameters: + - name: jamId + in: path + value: jam_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + contentId: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + description: conformance + successCriteria: + - condition: $statusCode == 400 + + - workflowId: submit-jam-content-unauthenticated + summary: submitJamContent refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: submit-jam-content + operationId: $sourceDescriptions.default.submitJamContent + parameters: + - name: jamId + in: path + value: jam_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-assigned-permissions + summary: Assigned permissions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: assigned-permissions + operationId: $sourceDescriptions.default.getAssignedPermissions + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-assigned-permissions-unauthenticated + summary: getAssignedPermissions refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-assigned-permissions + operationId: $sourceDescriptions.default.getAssignedPermissions + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-config + summary: Config + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: config + operationId: $sourceDescriptions.default.getConfig + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-css + summary: Css + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: css + operationId: $sourceDescriptions.default.getCSS + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-current-online-users + summary: Online users + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: online-users + operationId: $sourceDescriptions.default.getCurrentOnlineUsers + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-health + summary: Health + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: health + operationId: $sourceDescriptions.default.getHealth + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-health-unauthenticated + summary: getHealth refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-health + operationId: $sourceDescriptions.default.getHealth + successCriteria: + - condition: $statusCode == 401 + - workflowId: get-info-push + summary: Info push + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: info-push + operationId: $sourceDescriptions.default.getInfoPush + successCriteria: + - condition: $statusCode == 400 + + - workflowId: get-info-push-quick-menu-banner + summary: Info push quick menu banner + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: info-push-quick-menu-banner + operationId: $sourceDescriptions.default.getInfoPush + parameters: + - name: include + in: query + value: quick-menu-banner + - name: require + in: query + value: quick-menu-banner + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-info-push-user-all + summary: Info push user all + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: info-push-user-all + operationId: $sourceDescriptions.default.getInfoPush + parameters: + - name: include + in: query + value: user-all + - name: require + in: query + value: user-all + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-java-script + summary: Javascript + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: javascript + operationId: $sourceDescriptions.default.getJavaScript + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-permission + summary: Get permission + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-permission + operationId: $sourceDescriptions.default.getPermission + parameters: + - name: permissionId + in: path + value: prms_fe07c8a7-a4ca-4eda-97e5-e241040ef6f8 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-permissions + summary: Permissions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: permissions + operationId: $sourceDescriptions.default.getPermissions + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-system-time + summary: System time + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: system-time + operationId: $sourceDescriptions.default.getSystemTime + successCriteria: + - condition: $statusCode == 200 + + - workflowId: accept-friend-request-not-found + summary: acceptFriendRequest refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: accept-friend-request + operationId: $sourceDescriptions.default.acceptFriendRequest + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: accept-friend-request-unauthenticated + summary: acceptFriendRequest refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: accept-friend-request + operationId: $sourceDescriptions.default.acceptFriendRequest + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: acknowledge-notification-v2-not-found + summary: acknowledgeNotificationV2 refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: acknowledge-notification-v2 + operationId: $sourceDescriptions.default.acknowledgeNotificationV2 + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: acknowledge-notification-v2-unauthenticated + summary: acknowledgeNotificationV2 refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: acknowledge-notification-v2 + operationId: $sourceDescriptions.default.acknowledgeNotificationV2 + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: clear-notifications-unauthenticated + summary: clearNotifications refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: clear-notifications + operationId: $sourceDescriptions.default.clearNotifications + successCriteria: + - condition: $statusCode == 401 + + - workflowId: notification-lifecycle + summary: Invite the account to its own instance, then read, see and delete the + notification + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: create-instance + operationId: $sourceDescriptions.default.createInstance + requestBody: + contentType: application/json + payload: + worldId: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + type: private + region: use + ownerId: $workflows.session.outputs.userId + canRequestInvite: true + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + instanceId: $response.body#/instanceId + + - stepId: invite-self + operationId: $sourceDescriptions.default.inviteMyselfTo + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + - name: instanceId + in: path + value: $steps.create-instance.outputs.instanceId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/id != null + onFailure: + - name: stop + type: end + + outputs: + notificationId: $response.body#/id + + - stepId: notification + operationId: $sourceDescriptions.default.getNotificationV2 + parameters: + - name: notificationId + in: path + value: $steps.invite-self.outputs.notificationId + successCriteria: + - condition: $statusCode == 403 + + - stepId: get-notification + operationId: $sourceDescriptions.default.getNotification + parameters: + - name: notificationId + in: path + value: $steps.invite-self.outputs.notificationId + successCriteria: + - condition: $statusCode == 200 + + - stepId: mark-read + operationId: $sourceDescriptions.default.markNotificationAsRead + parameters: + - name: notificationId + in: path + value: $steps.invite-self.outputs.notificationId + successCriteria: + - condition: $statusCode == 200 + + - stepId: respond-invite + operationId: $sourceDescriptions.default.respondInvite + parameters: + - name: notificationId + in: path + value: $steps.invite-self.outputs.notificationId + requestBody: + contentType: application/json + payload: + responseSlot: 0 + successCriteria: + - condition: $statusCode == 400 + + - stepId: hide-notification + operationId: $sourceDescriptions.default.deleteNotification + parameters: + - name: notificationId + in: path + value: $steps.invite-self.outputs.notificationId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: delete-all-notification-v2s-unauthenticated + summary: deleteAllNotificationV2s refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-all-notification-v2s + operationId: $sourceDescriptions.default.deleteAllNotificationV2s + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-notification-unauthenticated + summary: deleteNotification refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-notification + operationId: $sourceDescriptions.default.deleteNotification + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-notification-v2-not-found + summary: deleteNotificationV2 refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-notification-v2 + operationId: $sourceDescriptions.default.deleteNotificationV2 + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-notification-v2-unauthenticated + summary: deleteNotificationV2 refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-notification-v2 + operationId: $sourceDescriptions.default.deleteNotificationV2 + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-notification-not-found + summary: getNotification refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-notification + operationId: $sourceDescriptions.default.getNotification + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-notification-unauthenticated + summary: getNotification refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-notification + operationId: $sourceDescriptions.default.getNotification + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-notification-v2-not-found + summary: getNotificationV2 refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-notification-v2 + operationId: $sourceDescriptions.default.getNotificationV2 + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-notification-v2-unauthenticated + summary: getNotificationV2 refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-notification-v2 + operationId: $sourceDescriptions.default.getNotificationV2 + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-notification-v2s + summary: Notifications v2 + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: notifications-v2 + operationId: $sourceDescriptions.default.getNotificationV2s + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-notification-v2s-query-parameters + summary: getNotificationV2s with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-notification-v2s + operationId: $sourceDescriptions.default.getNotificationV2s + parameters: + - name: limit + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-notification-v2s-unauthenticated + summary: getNotificationV2s refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-notification-v2s + operationId: $sourceDescriptions.default.getNotificationV2s + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-notifications + summary: Notification list + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: notifications + operationId: $sourceDescriptions.default.getNotifications + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-notifications-query-parameters + summary: getNotifications with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-notifications + operationId: $sourceDescriptions.default.getNotifications + parameters: + - name: hidden + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: sent + in: query + value: false + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-notifications-unauthenticated + summary: getNotifications refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-notifications + operationId: $sourceDescriptions.default.getNotifications + successCriteria: + - condition: $statusCode == 401 + + - workflowId: mark-notification-as-read-unauthenticated + summary: markNotificationAsRead refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: mark-notification-as-read + operationId: $sourceDescriptions.default.markNotificationAsRead + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: reply-notification-v2-not-found + summary: replyNotificationV2 refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: reply-notification-v2 + operationId: $sourceDescriptions.default.replyNotificationV2 + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: reply-notification-v2-unauthenticated + summary: replyNotificationV2 refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: reply-notification-v2 + operationId: $sourceDescriptions.default.replyNotificationV2 + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: respond-notification-v2-not-found + summary: respondNotificationV2 refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: respond-notification-v2 + operationId: $sourceDescriptions.default.respondNotificationV2 + parameters: + - name: notificationId + in: path + value: not_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + requestBody: + contentType: application/json + payload: + responseType: conformance + successCriteria: + - condition: $statusCode == 404 + + - workflowId: respond-notification-v2-unauthenticated + summary: respondNotificationV2 refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: respond-notification-v2 + operationId: $sourceDescriptions.default.respondNotificationV2 + parameters: + - name: notificationId + in: path + value: not_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: clear-all-player-moderations-unauthenticated + summary: clearAllPlayerModerations refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: clear-all-player-moderations + operationId: $sourceDescriptions.default.clearAllPlayerModerations + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-player-moderations-unauthenticated + summary: getPlayerModerations refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-player-moderations + operationId: $sourceDescriptions.default.getPlayerModerations + successCriteria: + - condition: $statusCode == 401 + - workflowId: player-moderation-lifecycle + summary: Creates then clears real player moderations + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: player-moderations + operationId: $sourceDescriptions.default.getPlayerModerations + successCriteria: + - condition: $statusCode == 200 + + - stepId: moderate-user + operationId: $sourceDescriptions.default.moderateUser + requestBody: + contentType: application/json + payload: + moderated: usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469 + type: unmute + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/targetUserId == + 'usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469' + + - stepId: player-moderations-filtered + operationId: $sourceDescriptions.default.getPlayerModerations + parameters: + - name: type + in: query + value: unmute + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/targetUserId == + 'usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469' + - condition: $response.body#/0/type == 'unmute' + + - stepId: clear-player-moderations + operationId: $sourceDescriptions.default.clearAllPlayerModerations + successCriteria: + - condition: $statusCode == 200 + + - workflowId: moderate-user-unauthenticated + summary: moderateUser refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: moderate-user + operationId: $sourceDescriptions.default.moderateUser + successCriteria: + - condition: $statusCode == 401 + + - workflowId: unmoderate-user-unauthenticated + summary: unmoderateUser refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: unmoderate-user + operationId: $sourceDescriptions.default.unmoderateUser + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-print-unauthenticated + summary: deletePrint refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-print + operationId: $sourceDescriptions.default.deletePrint + parameters: + - name: printId + in: path + value: prnt_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: edit-print-unauthenticated + summary: editPrint refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: edit-print + operationId: $sourceDescriptions.default.editPrint + parameters: + - name: printId + in: path + value: prnt_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-print-unauthenticated + summary: getPrint refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-print + operationId: $sourceDescriptions.default.getPrint + parameters: + - name: printId + in: path + value: prnt_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-prints + summary: User prints + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: user-prints + operationId: $sourceDescriptions.default.getUserPrints + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-prints-unauthenticated + summary: getUserPrints refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-prints + operationId: $sourceDescriptions.default.getUserPrints + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: upload-print-unauthenticated + summary: uploadPrint refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: upload-print + operationId: $sourceDescriptions.default.uploadPrint + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-prop-not-found + summary: deleteProp refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-prop + operationId: $sourceDescriptions.default.deleteProp + parameters: + - name: propId + in: path + value: prop_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: delete-prop-unauthenticated + summary: deleteProp refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-prop + operationId: $sourceDescriptions.default.deleteProp + parameters: + - name: propId + in: path + value: prop_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-prop-not-found + summary: getProp refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-prop + operationId: $sourceDescriptions.default.getProp + parameters: + - name: propId + in: path + value: prop_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-prop-unauthenticated + summary: getProp refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-prop + operationId: $sourceDescriptions.default.getProp + parameters: + - name: propId + in: path + value: prop_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-prop-publish-status-not-found + summary: getPropPublishStatus refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-prop-publish-status + operationId: $sourceDescriptions.default.getPropPublishStatus + parameters: + - name: propId + in: path + value: prop_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: list-props + summary: Props + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: props + operationId: $sourceDescriptions.default.listProps + successCriteria: + - condition: $statusCode == 200 || $statusCode == 403 + + - workflowId: list-props-query-parameters + summary: listProps with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: list-props + operationId: $sourceDescriptions.default.listProps + parameters: + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: list-props-unauthenticated + summary: listProps refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: list-props + operationId: $sourceDescriptions.default.listProps + parameters: + - name: authorId + in: query + value: id_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: publish-prop-not-found + summary: publishProp refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: publish-prop + operationId: $sourceDescriptions.default.publishProp + parameters: + - name: propId + in: path + value: prop_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: unpublish-prop-not-found + summary: unpublishProp refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: unpublish-prop + operationId: $sourceDescriptions.default.unpublishProp + parameters: + - name: propId + in: path + value: prop_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: update-prop-not-found + summary: updateProp refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-prop + operationId: $sourceDescriptions.default.updateProp + parameters: + - name: propId + in: path + value: prop_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 400 + + - workflowId: add-tags + summary: Tag changes on another user are rejected + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: add-tag-other-user + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.addTags + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + requestBody: + contentType: application/json + payload: + tags: + - language_kor + successCriteria: + - condition: $statusCode == 401 || $statusCode == 403 || $statusCode == 404 + + - workflowId: add-tags-unauthenticated + summary: addTags refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: add-tags + operationId: $sourceDescriptions.default.addTags + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: check-user-persistence-exists-not-found + summary: checkUserPersistenceExists refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: check-user-persistence-exists + operationId: $sourceDescriptions.default.checkUserPersistenceExists + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: check-user-persistence-exists-unauthenticated + summary: checkUserPersistenceExists refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: check-user-persistence-exists + operationId: $sourceDescriptions.default.checkUserPersistenceExists + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-all-user-persistence-data-unauthenticated + summary: deleteAllUserPersistenceData refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-all-user-persistence-data + operationId: $sourceDescriptions.default.deleteAllUserPersistenceData + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-user-persistence-not-found + summary: deleteUserPersistence refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-user-persistence + operationId: $sourceDescriptions.default.deleteUserPersistence + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: delete-user-persistence-unauthenticated + summary: deleteUserPersistence refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-user-persistence + operationId: $sourceDescriptions.default.deleteUserPersistence + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-blocked-groups + summary: Blocked groups + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: blocked-groups + operationId: $sourceDescriptions.default.getBlockedGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-blocked-groups-unauthenticated + summary: getBlockedGroups refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-blocked-groups + operationId: $sourceDescriptions.default.getBlockedGroups + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: profile-update-restore + summary: Update the writable profile fields, confirm they applied, restore them + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: marker + operationId: $sourceDescriptions.local.execute + requestBody: + contentType: application/json + payload: + command: sh + args: + - -c + - openssl rand -hex 6 | tr -d '\n' + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/exitCode == 0 + onFailure: + - name: stop + type: end + + outputs: + value: $response.body#/stdout + + - stepId: current-before + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 200 + onFailure: + - name: stop + type: end + + outputs: + bioLinks: $response.body#/bioLinks + pronouns: $response.body#/pronouns + status: $response.body#/status + statusDescription: $response.body#/statusDescription + isBoopingEnabled: $response.body#/isBoopingEnabled + unsubscribe: $response.body#/unsubscribe + + - stepId: update-profile + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + requestBody: + contentType: application/json + payload: + bio: $steps.marker.outputs.value + statusDescription: $steps.marker.outputs.value + pronouns: they/them + status: active + bioLinks: $steps.current-before.outputs.bioLinks + isBoopingEnabled: $steps.current-before.outputs.isBoopingEnabled + unsubscribe: $steps.current-before.outputs.unsubscribe + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/bio == $steps.marker.outputs.value + - condition: $response.body#/statusDescription == $steps.marker.outputs.value + - condition: $response.body#/pronouns == 'they/them' + - condition: $response.body#/status == 'active' + + - stepId: verify-current-user + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getCurrentUser + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/bio == $steps.marker.outputs.value + + - stepId: verify-get-user + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/bio == $steps.marker.outputs.value + + - stepId: restore-profile + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + requestBody: + contentType: application/json + payload: + bio: "" + statusDescription: $steps.current-before.outputs.statusDescription + pronouns: $steps.current-before.outputs.pronouns + status: $steps.current-before.outputs.status + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/bio == '' + - condition: $response.body#/pronouns == $steps.current-before.outputs.pronouns + - condition: $response.body#/status == $steps.current-before.outputs.status + + - stepId: verify-restored + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/bio == '' + + - workflowId: get-invited-groups + summary: Invited groups + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: invited-groups + operationId: $sourceDescriptions.default.getInvitedGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-invited-groups-unauthenticated + summary: getInvitedGroups refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-invited-groups + operationId: $sourceDescriptions.default.getInvitedGroups + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-mutual-friends + summary: Mutual friends + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: mutual-friends + operationId: $sourceDescriptions.default.getMutualFriends + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-mutual-friends-query-parameters + summary: getMutualFriends with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-mutual-friends + operationId: $sourceDescriptions.default.getMutualFriends + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-mutual-friends-unauthenticated + summary: getMutualFriends refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-mutual-friends + operationId: $sourceDescriptions.default.getMutualFriends + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-mutual-groups + summary: Mutual groups + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: mutual-groups + operationId: $sourceDescriptions.default.getMutualGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-mutual-groups-query-parameters + summary: getMutualGroups with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-mutual-groups + operationId: $sourceDescriptions.default.getMutualGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-mutual-groups-unauthenticated + summary: getMutualGroups refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-mutual-groups + operationId: $sourceDescriptions.default.getMutualGroups + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-mutuals + summary: Mutuals + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: mutuals + operationId: $sourceDescriptions.default.getMutuals + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-mutuals-unauthenticated + summary: getMutuals refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-mutuals + operationId: $sourceDescriptions.default.getMutuals + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-private-profile + summary: Private profile + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: private-profile + operationId: $sourceDescriptions.default.getPrivateProfile + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-private-profile-unauthenticated + summary: getPrivateProfile refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-private-profile + operationId: $sourceDescriptions.default.getPrivateProfile + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-public-profile + summary: Public profile + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: public-profile + operationId: $sourceDescriptions.default.getPublicProfile + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-public-profile-unauthenticated + summary: getPublicProfile refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-public-profile + operationId: $sourceDescriptions.default.getPublicProfile + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user + summary: Get user + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-user + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469 + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/id == 'usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469' + + - workflowId: get-user-not-found + summary: getUser refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-user + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-user-own + summary: Get own user + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-own-user + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/id == $workflows.session.outputs.userId + + - workflowId: get-user-unauthenticated + summary: getUser refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-unknown + summary: Update unknown user + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-unknown-user + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: user-tag-round-trip + summary: Add a profile tag, confirm it applied, remove it, confirm it is gone + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: verify-absent-first + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - context: $response.body#/tags + condition: ^(?!.*language_kor).*$ + type: regex + onFailure: + - name: stop + type: end + + - stepId: add-tag + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.addTags + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + requestBody: + contentType: application/json + payload: + tags: + - language_kor + successCriteria: + - condition: $statusCode == 200 + - context: $response.body#/tags + condition: language_kor + type: regex + + - stepId: verify-applied + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - context: $response.body#/tags + condition: language_kor + type: regex + + - stepId: restore + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.removeTags + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + requestBody: + contentType: application/json + payload: + tags: + - language_kor + successCriteria: + - condition: $statusCode == 200 + + - stepId: verify-restored + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.getUser + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - context: $response.body#/tags + condition: ^(?!.*language_kor).*$ + type: regex + + - workflowId: get-user-all-group-permissions + summary: Group permissions + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: group-permissions + operationId: $sourceDescriptions.default.getUserAllGroupPermissions + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-all-group-permissions-unauthenticated + summary: getUserAllGroupPermissions refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-all-group-permissions + operationId: $sourceDescriptions.default.getUserAllGroupPermissions + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-by-name + summary: User by name + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: user-by-name + operationId: $sourceDescriptions.default.getUserByName + parameters: + - name: username + in: path + value: $workflows.session.outputs.displayName + successCriteria: + - condition: $statusCode == 403 + + - workflowId: get-user-by-name-unauthenticated + summary: getUserByName refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-by-name + operationId: $sourceDescriptions.default.getUserByName + parameters: + - name: username + in: path + value: conformance + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-feedback + summary: User feedback + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: user-feedback + operationId: $sourceDescriptions.default.getUserFeedback + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + - name: n + in: query + value: 100 + - name: offset + in: query + value: 0 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-feedback-unauthenticated + summary: getUserFeedback refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-feedback + operationId: $sourceDescriptions.default.getUserFeedback + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-group-instances + summary: Group instances + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: group-instances + operationId: $sourceDescriptions.default.getUserGroupInstances + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-group-instances-unauthenticated + summary: getUserGroupInstances refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-group-instances + operationId: $sourceDescriptions.default.getUserGroupInstances + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-group-instances-for-group-unauthenticated + summary: getUserGroupInstancesForGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-group-instances-for-group + operationId: $sourceDescriptions.default.getUserGroupInstancesForGroup + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: groupId + in: path + value: grp_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-group-requests + summary: Group requests + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: group-requests + operationId: $sourceDescriptions.default.getUserGroupRequests + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-group-requests-unauthenticated + summary: getUserGroupRequests refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-group-requests + operationId: $sourceDescriptions.default.getUserGroupRequests + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-groups + summary: User groups + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: user-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-groups-unauthenticated + summary: getUserGroups refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: group-cancel-request + summary: Cancelling a join request we never made + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: cancel-request + operationId: $sourceDescriptions.default.cancelGroupRequest + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 400 + + - workflowId: group-owner-cannot-leave + summary: The owner is refused when leaving their own group + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/ownerId == $workflows.session.outputs.userId + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: leave + operationId: $sourceDescriptions.default.leaveGroup + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + successCriteria: + - condition: $statusCode == 403 + + - workflowId: group-representation + summary: Represent the group, then stop representing it + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: own-groups + operationId: $sourceDescriptions.default.getUserGroups + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/0/groupId != null + onFailure: + - name: stop + type: end + + outputs: + groupId: $response.body#/0/groupId + + - stepId: represent + operationId: $sourceDescriptions.default.updateGroupRepresentation + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + isRepresenting: true + successCriteria: + - condition: $statusCode == 200 + + - stepId: represented-group + operationId: $sourceDescriptions.default.getUserRepresentedGroup + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/isRepresenting == true + + - stepId: public-profile + operationId: $sourceDescriptions.default.getPublicProfile + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - stepId: stop-representing + operationId: $sourceDescriptions.default.updateGroupRepresentation + parameters: + - name: groupId + in: path + value: $steps.own-groups.outputs.groupId + requestBody: + contentType: application/json + payload: + isRepresenting: false + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-note-unauthenticated + summary: getUserNote refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-note + operationId: $sourceDescriptions.default.getUserNote + parameters: + - name: userNoteId + in: path + value: unot_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-notes + summary: User notes + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: user-notes + operationId: $sourceDescriptions.default.getUserNotes + parameters: + - name: n + in: query + value: 100 + - name: offset + in: query + value: 0 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-notes-unauthenticated + summary: getUserNotes refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-notes + operationId: $sourceDescriptions.default.getUserNotes + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-represented-group + summary: Represented group + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: represented-group + operationId: $sourceDescriptions.default.getUserRepresentedGroup + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-represented-group-unauthenticated + summary: getUserRepresentedGroup refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-represented-group + operationId: $sourceDescriptions.default.getUserRepresentedGroup + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-user-tutorial-status + summary: Tutorial status + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: tutorial-status + operationId: $sourceDescriptions.default.getUserTutorialStatus + parameters: + - name: userId + in: path + value: $workflows.session.outputs.userId + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-user-tutorial-status-unauthenticated + summary: getUserTutorialStatus refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-user-tutorial-status + operationId: $sourceDescriptions.default.getUserTutorialStatus + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: remove-tags-unauthenticated + summary: removeTags refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: remove-tags + operationId: $sourceDescriptions.default.removeTags + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: search-active-users + summary: Active user search is withdrawn + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-active-users + operationId: $sourceDescriptions.default.searchActiveUsers + parameters: + - name: search + in: query + value: conformance + successCriteria: + - condition: $statusCode == 404 + + - workflowId: search-users + summary: Search users + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-users + operationId: $sourceDescriptions.default.searchUsers + parameters: + - name: search + in: query + value: tupper + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-users-no-parameters + summary: Search no parameters + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-no-parameters + operationId: $sourceDescriptions.default.searchUsers + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-users-query-parameters + summary: searchUsers with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-users + operationId: $sourceDescriptions.default.searchUsers + parameters: + - name: isInternalVariant + in: query + value: false + - name: offset + in: query + value: 1 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-users-unauthenticated + summary: searchUsers refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: search-users + operationId: $sourceDescriptions.default.searchUsers + successCriteria: + - condition: $statusCode == 401 + + - workflowId: search-users-with-limit + summary: Search with limit + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-with-limit + operationId: $sourceDescriptions.default.searchUsers + parameters: + - name: search + in: query + value: a + - name: n + in: query + value: 5 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: update-badge-not-found + summary: updateBadge refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-badge + operationId: $sourceDescriptions.default.updateBadge + parameters: + - name: userId + in: path + value: usr_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: badgeId + in: path + value: id_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 403 + + - workflowId: update-badge-unauthenticated + summary: updateBadge refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-badge + operationId: $sourceDescriptions.default.updateBadge + parameters: + - name: userId + in: path + value: usr_00000000-0000-0000-0000-000000000000 + - name: badgeId + in: path + value: bdg_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-user + summary: Update other user + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-other-user + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + operationId: $sourceDescriptions.default.updateUser + parameters: + - name: userId + in: path + value: usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469 + requestBody: + contentType: application/json + payload: + bio: should-be-rejected + successCriteria: + - condition: $statusCode == 401 || $statusCode == 403 + + - workflowId: update-user-note-unauthenticated + summary: updateUserNote refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-user-note + operationId: $sourceDescriptions.default.updateUserNote + successCriteria: + - condition: $statusCode == 401 + - workflowId: user-note-lifecycle + summary: Writes a note against another user, then reads it back by id + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-note + operationId: $sourceDescriptions.default.updateUserNote + requestBody: + contentType: application/json + payload: + targetUserId: usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469 + note: system_haha_we_actually_ended_up_documenting_this_one_too + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/targetUserId == + 'usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469' + onFailure: + - name: stop + type: end + + outputs: + userNoteId: $response.body#/id + + - stepId: get-note + operationId: $sourceDescriptions.default.getUserNote + parameters: + - name: userNoteId + in: path + value: $steps.update-note.outputs.userNoteId + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/targetUserId == + 'usr_c1644b5b-3ca4-45b4-97c6-a2a0de70d469' + + - workflowId: add-world-tags-unauthenticated + summary: addWorldTags refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: add-world-tags + operationId: $sourceDescriptions.default.addWorldTags + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: create-world-unauthenticated + summary: createWorld refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: create-world + operationId: $sourceDescriptions.default.createWorld + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-world-not-found + summary: deleteWorld refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-world + operationId: $sourceDescriptions.default.deleteWorld + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 200 + + - workflowId: delete-world-unauthenticated + summary: deleteWorld refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-world + operationId: $sourceDescriptions.default.deleteWorld + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: delete-world-platform-not-found + summary: deleteWorldPlatform refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: delete-world-platform + operationId: $sourceDescriptions.default.deleteWorldPlatform + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + - name: publishedPlatform + in: path + value: standalonewindows + successCriteria: + - condition: $statusCode == 404 + + - workflowId: delete-world-platform-unauthenticated + summary: deleteWorldPlatform refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: delete-world-platform + operationId: $sourceDescriptions.default.deleteWorldPlatform + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + - name: publishedPlatform + in: path + value: standalonewindows + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-active-worlds + summary: Active worlds + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: active-worlds + operationId: $sourceDescriptions.default.getActiveWorlds + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-active-worlds-query-parameters + summary: getActiveWorlds with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-active-worlds + operationId: $sourceDescriptions.default.getActiveWorlds + parameters: + - name: featured + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: ascending + - name: releaseStatus + in: query + value: public + - name: sort + in: query + value: _created_at + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-active-worlds-unauthenticated + summary: getActiveWorlds refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-active-worlds + operationId: $sourceDescriptions.default.getActiveWorlds + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-favorited-worlds + summary: Favorited worlds + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: favorited-worlds + operationId: $sourceDescriptions.default.getFavoritedWorlds + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorited-worlds-query-parameters + summary: getFavoritedWorlds with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-favorited-worlds + operationId: $sourceDescriptions.default.getFavoritedWorlds + parameters: + - name: featured + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: ascending + - name: releaseStatus + in: query + value: public + - name: sort + in: query + value: _created_at + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-favorited-worlds-unauthenticated + summary: getFavoritedWorlds refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-favorited-worlds + operationId: $sourceDescriptions.default.getFavoritedWorlds + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-recent-worlds + summary: Recent worlds + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: recent-worlds + operationId: $sourceDescriptions.default.getRecentWorlds + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-recent-worlds-query-parameters + summary: getRecentWorlds with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-recent-worlds + operationId: $sourceDescriptions.default.getRecentWorlds + parameters: + - name: featured + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: ascending + - name: releaseStatus + in: query + value: public + - name: sort + in: query + value: _created_at + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-recent-worlds-unauthenticated + summary: getRecentWorlds refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-recent-worlds + operationId: $sourceDescriptions.default.getRecentWorlds + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-world-black-cat + summary: Black cat + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: black-cat + operationId: $sourceDescriptions.default.getWorld + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/id == 'wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b' + - condition: $response.body#/storeId != null + + - workflowId: get-world-not-found + summary: getWorld refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-world + operationId: $sourceDescriptions.default.getWorld + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-world-vrchat-home + summary: Vrchat home + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: vrchat-home + operationId: $sourceDescriptions.default.getWorld + parameters: + - name: worldId + in: path + value: wrld_4432ea9b-729c-46e3-8eaf-846aa0a37fdd + successCriteria: + - condition: $statusCode == 200 + - condition: $response.body#/id == 'wrld_4432ea9b-729c-46e3-8eaf-846aa0a37fdd' + + - workflowId: get-world-instance-unauthenticated + summary: getWorldInstance refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-world-instance + operationId: $sourceDescriptions.default.getWorldInstance + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + - name: instanceId + in: path + value: 0 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: get-world-metadata + summary: World metadata + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: world-metadata + operationId: $sourceDescriptions.default.getWorldMetadata + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-world-metadata-not-found + summary: getWorldMetadata refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: get-world-metadata + operationId: $sourceDescriptions.default.getWorldMetadata + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: get-world-publish-status + summary: World publish status + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: world-publish-status + operationId: $sourceDescriptions.default.getWorldPublishStatus + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + successCriteria: + - condition: $statusCode == 200 + + - workflowId: get-world-publish-status-unauthenticated + summary: getWorldPublishStatus refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: get-world-publish-status + operationId: $sourceDescriptions.default.getWorldPublishStatus + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: publish-world-not-found + summary: publishWorld refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: publish-world + operationId: $sourceDescriptions.default.publishWorld + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: publish-world-unauthenticated + summary: publishWorld refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: publish-world + operationId: $sourceDescriptions.default.publishWorld + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: remove-world-tags + summary: Removing tags from a world we do not own is refused + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: remove-tags + operationId: $sourceDescriptions.default.removeWorldTags + parameters: + - name: worldId + in: path + value: wrld_4cf554b4-430c-4f8f-b53e-1f294eed230b + requestBody: + contentType: application/json + payload: + tags: + - author_tag_conformance + successCriteria: + - condition: $statusCode == 403 + + - workflowId: search-worlds + summary: Search worlds + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-worlds + operationId: $sourceDescriptions.default.searchWorlds + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-worlds-query-parameters + summary: searchWorlds with every fillable query parameter + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: search-worlds + operationId: $sourceDescriptions.default.searchWorlds + parameters: + - name: avatarSpecific + in: query + value: false + - name: featured + in: query + value: false + - name: fuzzy + in: query + value: false + - name: n + in: query + value: 1 + - name: offset + in: query + value: 1 + - name: order + in: query + value: ascending + - name: releaseStatus + in: query + value: public + - name: sort + in: query + value: _created_at + - name: user + in: query + value: me + successCriteria: + - condition: $statusCode == 200 + + - workflowId: search-worlds-unauthenticated + summary: searchWorlds refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: search-worlds + operationId: $sourceDescriptions.default.searchWorlds + successCriteria: + - condition: $statusCode == 401 + + - workflowId: unpublish-world-not-found + summary: unpublishWorld refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: unpublish-world + operationId: $sourceDescriptions.default.unpublishWorld + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 404 + + - workflowId: unpublish-world-unauthenticated + summary: unpublishWorld refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: unpublish-world + operationId: $sourceDescriptions.default.unpublishWorld + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 + + - workflowId: update-world-not-found + summary: updateWorld refuses a resource that does not exist + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: update-world + operationId: $sourceDescriptions.default.updateWorld + parameters: + - name: worldId + in: path + value: wrld_3f2a9c14-8d7b-4e05-a6c3-1b9e5d0f7a82 + successCriteria: + - condition: $statusCode == 400 + + - workflowId: update-world-unauthenticated + summary: updateWorld refuses an anonymous caller + parameters: + - reference: $components.parameters.userAgent + steps: + - stepId: update-world + operationId: $sourceDescriptions.default.updateWorld + parameters: + - name: worldId + in: path + value: wrld_00000000-0000-0000-0000-000000000000 + successCriteria: + - condition: $statusCode == 401 diff --git a/test/run.sh b/test/run.sh new file mode 100755 index 00000000..8c6c5a7c --- /dev/null +++ b/test/run.sh @@ -0,0 +1,80 @@ +#!/bin/sh +# Drives the suite against the live API. Captures land in .out/har/, which +# `coverage` and `drift` read as a folder. +# +# `schema check` stays a warning: it is the standing backlog of fields the +# description gets wrong, and erroring on it would leave the suite always red. +set -eu + +cd "$(dirname "$0")/.." + +# Braces in the value break `${VAR:=default}`. +if [ -z "${TEST_SEVERITY:-}" ]; then + TEST_SEVERITY='{"SCHEMA_CHECK":"warn"}' +fi + +if [ -f test/.env ]; then + set -a + . ./test/.env + set +a +fi + +# An empty input is worse than a missing one: respect sends the literal +# `{userId}` in the path. +: "${VRCHAT_FRIEND_ID:?unset — see test/.env.example}" +: "${VRCHAT_EMAIL:?unset — see test/.env.example}" + +mkdir -p test/.out/har + +# Fixed port, because `sourceDescriptions` takes no expressions. +httpexec --port 65482 & +httpexec_pid=$! + +# Only EXIT kills the server, so it happens once. INT and TERM exit, which +# fires EXIT; killing there would leave the script running against a dead one. +trap 'kill "$httpexec_pid" 2>/dev/null' EXIT +trap 'exit 130' INT +trap 'exit 143' TERM + +# Bind is not instant, and respect fetches the description before step one. +curl -sf --retry 20 --retry-delay 1 --retry-connrefused -o /dev/null \ + http://127.0.0.1:65482/openapi.json + +# respect rejects `--skip` alongside `--workflow`, so naming a workflow drops +# the skips. Only what you name runs: `pnpm test -w session -w get-current-user`. +# A partial run writes its capture elsewhere, so it cannot overwrite the one +# `coverage` and `drift` read as a whole-suite record. +skips='--skip logout --skip invite-message-lifecycle --skip group-lifecycle --skip group-calendar-lifecycle' +capture=test/.out/har/arazzo.har +for argument do + case $argument in + -w | --workflow) skips=''; capture=test/.out/partial.har ;; + esac +done + +# `login` caches a session under .out/ and `session` reads it back. Skipping it +# while the cache is warm keeps repeated runs off the login rate limit. Delete +# test/.out/session to force a fresh login. +if [ ! -s test/.out/session ]; then + : "${VRCHAT_PASSWORD:?unset — see test/.env.example}" + : "${VRCHAT_TOTP_SECRET:?unset — see test/.env.example}" + + set -- \ + --input password="$VRCHAT_PASSWORD" \ + --input totpSecret="$VRCHAT_TOTP_SECRET" \ + "$@" +elif [ -n "$skips" ]; then + set -- --skip login "$@" +fi + +# `logout` kills the session, `invite-message-lifecycle` locks a slot for half +# an hour, and the two group lifecycles create a group, which is rate limited +# for hours. Run those deliberately: `pnpm test -w group-lifecycle`. +redocly respect test/arazzo.yaml \ + ${skips} \ + --har-output "$capture" \ + --input friendId="$VRCHAT_FRIEND_ID" \ + --input username="${VRCHAT_USERNAME:-$VRCHAT_EMAIL}" \ + --input email="$VRCHAT_EMAIL" \ + --severity "$TEST_SEVERITY" \ + "$@" From 05d20fc9beb4e9f0e3a0fe9e0cd622236f73946c Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:26:50 -0400 Subject: [PATCH 13/17] test: cover listStores without a sellerId --- test/arazzo.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/arazzo.yaml b/test/arazzo.yaml index ef898913..5a9d31ab 100644 --- a/test/arazzo.yaml +++ b/test/arazzo.yaml @@ -3061,6 +3061,20 @@ workflows: successCriteria: - condition: $statusCode == 403 + - workflowId: list-stores-no-seller + summary: listStores without a seller to scope to + parameters: + - reference: $components.parameters.userAgent + x-security: + - schemeName: authCookie + values: + apiKey: $workflows.session.outputs.sessionToken + steps: + - stepId: stores + operationId: $sourceDescriptions.default.listStores + successCriteria: + - condition: $statusCode == 400 + - workflowId: list-stores-query-parameters summary: listStores with every fillable query parameter parameters: From 6afabc1e6314cf5c1f3fb59dac4e368adf0d5b1d Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:26:54 -0400 Subject: [PATCH 14/17] docs: record curl checks and what a not-implemented 404 means --- CLAUDE.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 84eb5ad6..304f4f73 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,6 +48,32 @@ workflow to `test/arazzo.yaml`; never close the gap by guessing. `required` omits is either required, or missing the workflow that shows it absent. A property in `required` that some response omits is neither. +## Check with curl, document from a workflow + +One `curl` answers what a route does now, without running the suite. The session +cache holds the cookie: + +```sh +curl -s -A "specification-test/1 (https://vrchat.community)" \ + -b "auth=$(cat test/.out/session)" \ + https://api.vrchat.cloud/api/1/economy/stores +``` + +Use it to check a single route, to confirm what a capture only implies, or to +separate an API behaviour from a tooling artifact: when curl and the suite +disagree on the same URL, the client differs, not VRChat. + +A curl records one moment. Never write a description from one alone. Add the +workflow to `test/arazzo.yaml`, then document what it captures. + +## A "not implemented" 404 means no route matched + +VRChat answers `{"error":"The endpoint you're looking for is not implemented by +our system."}` when no route matches. A removed endpoint and a malformed path +both produce it: `/api/1//css/app.css` and a percent-encoded dot return it +byte-for-byte. This body never establishes that a route is gone. Request the +exact path directly before marking anything deprecated. + ## One operation per workflow A failing step ends its workflow, so every operation after it goes unexercised From 04d57a49ebbbec1b27f5ffa9cc5e1561fc6117e3 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:26:58 -0400 Subject: [PATCH 15/17] chore(deps): pin typescript to 6 so typescript-eslint can run --- package.json | 3 +- pnpm-lock.yaml | 575 ++++++++++++++++++------------------------------- 2 files changed, 214 insertions(+), 364 deletions(-) diff --git a/package.json b/package.json index a63ac0ab..e4211ce6 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "httpexec": "^0.0.2", "pluralize": "^8.0.0", "semver": "^7.7.3", - "totp-generator": "^2.0.1" + "totp-generator": "^2.0.1", + "typescript": "^6.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 029d2e77..1ec7aec4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 1.11.1 '@ariesclark/eslint-config': specifier: ^3.1.1 - version: 3.1.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2) + version: 3.1.1(@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.26)(tsx@4.20.6)(typescript@6.0.3)(yaml@2.8.2) '@jamesacarr/eslint-formatter-github-actions': specifier: ^0.2.0 version: 0.2.0 @@ -68,6 +68,9 @@ importers: totp-generator: specifier: ^2.0.1 version: 2.0.1 + typescript: + specifier: ^6.0.3 + version: 6.0.3 packages: @@ -154,16 +157,20 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true @@ -171,8 +178,8 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@clack/core@0.4.1': @@ -730,6 +737,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1113,185 +1126,65 @@ packages: '@types/urijs@1.19.26': resolution: {integrity: sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg==} - '@typescript-eslint/eslint-plugin@8.48.0': - resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} + '@typescript-eslint/eslint-plugin@8.66.0': + resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.48.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser': ^8.66.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.48.0': - resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==} + '@typescript-eslint/parser@8.66.0': + resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.48.0': - resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} + '@typescript-eslint/project-service@8.66.0': + resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.48.0': - resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} + '@typescript-eslint/scope-manager@8.66.0': + resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.48.0': - resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} + '@typescript-eslint/tsconfig-utils@8.66.0': + resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.48.0': - resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} + '@typescript-eslint/type-utils@8.66.0': + resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.48.0': - resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} + '@typescript-eslint/types@8.66.0': + resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.48.0': - resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} + '@typescript-eslint/typescript-estree@8.66.0': + resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.48.0': - resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} + '@typescript-eslint/utils@8.66.0': + resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.48.0': - resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} + '@typescript-eslint/visitor-keys@8.66.0': + resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/typescript-aix-ppc64@7.0.2': - resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} - engines: {node: '>=16.20.0'} - cpu: [ppc64] - os: [aix] - - '@typescript/typescript-darwin-arm64@7.0.2': - resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [darwin] - - '@typescript/typescript-darwin-x64@7.0.2': - resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [darwin] - - '@typescript/typescript-freebsd-arm64@7.0.2': - resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [freebsd] - - '@typescript/typescript-freebsd-x64@7.0.2': - resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [freebsd] - - '@typescript/typescript-linux-arm64@7.0.2': - resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [linux] - - '@typescript/typescript-linux-arm@7.0.2': - resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} - engines: {node: '>=16.20.0'} - cpu: [arm] - os: [linux] - - '@typescript/typescript-linux-loong64@7.0.2': - resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} - engines: {node: '>=16.20.0'} - cpu: [loong64] - os: [linux] - - '@typescript/typescript-linux-mips64el@7.0.2': - resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} - engines: {node: '>=16.20.0'} - cpu: [mips64el] - os: [linux] - - '@typescript/typescript-linux-ppc64@7.0.2': - resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} - engines: {node: '>=16.20.0'} - cpu: [ppc64] - os: [linux] - - '@typescript/typescript-linux-riscv64@7.0.2': - resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} - engines: {node: '>=16.20.0'} - cpu: [riscv64] - os: [linux] - - '@typescript/typescript-linux-s390x@7.0.2': - resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} - engines: {node: '>=16.20.0'} - cpu: [s390x] - os: [linux] - - '@typescript/typescript-linux-x64@7.0.2': - resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [linux] - - '@typescript/typescript-netbsd-arm64@7.0.2': - resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [netbsd] - - '@typescript/typescript-netbsd-x64@7.0.2': - resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [netbsd] - - '@typescript/typescript-openbsd-arm64@7.0.2': - resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [openbsd] - - '@typescript/typescript-openbsd-x64@7.0.2': - resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [openbsd] - - '@typescript/typescript-sunos-x64@7.0.2': - resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [sunos] - - '@typescript/typescript-win32-arm64@7.0.2': - resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [win32] - - '@typescript/typescript-win32-x64@7.0.2': - resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [win32] - '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -1508,6 +1401,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + baseline-browser-mapping@2.8.31: resolution: {integrity: sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==} hasBin: true @@ -1518,8 +1415,9 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} browserslist@4.28.0: resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} @@ -1977,6 +1875,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.1: resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2049,6 +1951,9 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2638,13 +2543,13 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} @@ -2654,8 +2559,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2838,8 +2743,8 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3103,6 +3008,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + toml-eslint-parser@0.10.0: resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3120,8 +3029,8 @@ packages: ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -3200,9 +3109,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@7.0.2: - resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} - engines: {node: '>=16.20.0'} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} hasBin: true ufo@1.6.1: @@ -3364,32 +3273,32 @@ snapshots: '@actions/io@1.1.3': {} - '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@7.0.2)': + '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@6.0.3)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.9.1 '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.39.1) '@eslint/markdown': 6.6.0 - '@stylistic/eslint-plugin': 2.13.0(eslint@9.39.1)(typescript@7.0.2) - '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2) - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@7.0.2) - '@vitest/eslint-plugin': 1.5.0(eslint@9.39.1)(typescript@7.0.2) + '@stylistic/eslint-plugin': 2.13.0(eslint@9.39.1)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1)(typescript@6.0.3) + '@typescript-eslint/parser': 8.66.0(eslint@9.39.1)(typescript@6.0.3) + '@vitest/eslint-plugin': 1.5.0(eslint@9.39.1)(typescript@6.0.3) eslint: 9.39.1 eslint-config-flat-gitignore: 1.0.1(eslint@9.39.1) eslint-flat-config-utils: 1.1.0 eslint-merge-processors: 1.0.0(eslint@9.39.1) eslint-plugin-antfu: 2.7.0(eslint@9.39.1) eslint-plugin-command: 2.1.0(eslint@9.39.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1) eslint-plugin-jsdoc: 50.8.0(eslint@9.39.1) eslint-plugin-jsonc: 2.21.0(eslint@9.39.1) - eslint-plugin-n: 17.23.1(eslint@9.39.1)(typescript@7.0.2) + eslint-plugin-n: 17.23.1(eslint@9.39.1)(typescript@6.0.3) eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 4.15.1(eslint@9.39.1)(typescript@7.0.2) + eslint-plugin-perfectionist: 4.15.1(eslint@9.39.1)(typescript@6.0.3) eslint-plugin-regexp: 2.10.0(eslint@9.39.1) eslint-plugin-toml: 0.12.0(eslint@9.39.1) eslint-plugin-unicorn: 56.0.1(eslint@9.39.1) - eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1) + eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1) eslint-plugin-vue: 9.33.0(eslint@9.39.1) eslint-plugin-yml: 1.19.0(eslint@9.39.1) eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.1) @@ -3420,14 +3329,14 @@ snapshots: '@antfu/utils@0.7.10': {} - '@ariesclark/eslint-config@3.1.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2)': + '@ariesclark/eslint-config@3.1.1(@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(postcss@8.5.26)(tsx@4.20.6)(typescript@6.0.3)(yaml@2.8.2)': dependencies: - '@antfu/eslint-config': 3.16.0(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@7.0.2) + '@antfu/eslint-config': 3.16.0(@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3))(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-refresh@0.4.24(eslint@9.39.1))(eslint@9.39.1)(typescript@6.0.3) eslint: 9.39.1 eslint-flat-config-utils: 0.4.0 esno: 4.8.0 local-pkg: 0.5.1 - tsup: 8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2) + tsup: 8.5.1(postcss@8.5.26)(tsx@4.20.6)(typescript@6.0.3)(yaml@2.8.2) transitivePeerDependencies: - '@eslint-react/eslint-plugin' - '@eslint/json' @@ -3466,20 +3375,22 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.5': + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.8 '@babel/runtime@7.28.4': {} - '@babel/types@7.28.5': + '@babel/types@7.29.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@clack/core@0.4.1': dependencies: @@ -3721,7 +3632,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/types': 8.66.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 @@ -3888,6 +3799,11 @@ snapshots: eslint: 9.39.1 ignore: 5.3.2 + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.1)': + dependencies: + eslint: 9.39.1 + eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': dependencies: eslint: 9.39.1 @@ -4027,7 +3943,7 @@ snapshots: '@redocly/ajv@8.18.1': dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4303,9 +4219,9 @@ snapshots: '@stoplight/yaml-ast-parser': 0.0.50 tslib: 2.8.1 - '@stylistic/eslint-plugin@2.13.0(eslint@9.39.1)(typescript@7.0.2)': + '@stylistic/eslint-plugin@2.13.0(eslint@9.39.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) eslint: 9.39.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -4358,157 +4274,96 @@ snapshots: '@types/urijs@1.19.26': {} - '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2)': + '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@7.0.2) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/parser': 8.66.0(eslint@9.39.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/type-utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.66.0 eslint: 9.39.1 - graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@7.0.2) - typescript: 7.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2)': + '@typescript-eslint/parser@8.66.0(eslint@9.39.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@7.0.2) - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.66.0 debug: 4.4.3 eslint: 9.39.1 - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.0(typescript@7.0.2)': + '@typescript-eslint/project-service@8.66.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@7.0.2) - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) + '@typescript-eslint/types': 8.66.0 debug: 4.4.3 - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.48.0': + '@typescript-eslint/scope-manager@8.66.0': dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/visitor-keys': 8.66.0 - '@typescript-eslint/tsconfig-utils@8.48.0(typescript@7.0.2)': + '@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)': dependencies: - typescript: 7.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@7.0.2)': + '@typescript-eslint/type-utils@8.66.0(eslint@9.39.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@7.0.2) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) debug: 4.4.3 eslint: 9.39.1 - ts-api-utils: 2.1.0(typescript@7.0.2) - typescript: 7.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.48.0': {} + '@typescript-eslint/types@8.66.0': {} - '@typescript-eslint/typescript-estree@8.48.0(typescript@7.0.2)': + '@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.48.0(typescript@7.0.2) - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@7.0.2) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/project-service': 8.66.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/visitor-keys': 8.66.0 debug: 4.4.3 - minimatch: 9.0.5 + minimatch: 10.2.6 semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@7.0.2) - typescript: 7.0.2 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2)': + '@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@7.0.2) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.1) + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) eslint: 9.39.1 - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.48.0': + '@typescript-eslint/visitor-keys@8.66.0': dependencies: - '@typescript-eslint/types': 8.48.0 - eslint-visitor-keys: 4.2.1 - - '@typescript/typescript-aix-ppc64@7.0.2': - optional: true - - '@typescript/typescript-darwin-arm64@7.0.2': - optional: true - - '@typescript/typescript-darwin-x64@7.0.2': - optional: true - - '@typescript/typescript-freebsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-freebsd-x64@7.0.2': - optional: true - - '@typescript/typescript-linux-arm64@7.0.2': - optional: true - - '@typescript/typescript-linux-arm@7.0.2': - optional: true - - '@typescript/typescript-linux-loong64@7.0.2': - optional: true - - '@typescript/typescript-linux-mips64el@7.0.2': - optional: true - - '@typescript/typescript-linux-ppc64@7.0.2': - optional: true - - '@typescript/typescript-linux-riscv64@7.0.2': - optional: true - - '@typescript/typescript-linux-s390x@7.0.2': - optional: true - - '@typescript/typescript-linux-x64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-sunos-x64@7.0.2': - optional: true - - '@typescript/typescript-win32-arm64@7.0.2': - optional: true - - '@typescript/typescript-win32-x64@7.0.2': - optional: true + '@typescript-eslint/types': 8.66.0 + eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -4569,19 +4424,19 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/eslint-plugin@1.5.0(eslint@9.39.1)(typescript@7.0.2)': + '@vitest/eslint-plugin@1.5.0(eslint@9.39.1)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) eslint: 9.39.1 optionalDependencies: - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color '@vue/compiler-core@3.5.25': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.8 '@vue/shared': 3.5.25 entities: 4.5.0 estree-walker: 2.0.2 @@ -4594,14 +4449,14 @@ snapshots: '@vue/compiler-sfc@3.5.25': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.8 '@vue/compiler-core': 3.5.25 '@vue/compiler-dom': 3.5.25 '@vue/compiler-ssr': 3.5.25 '@vue/shared': 3.5.25 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.6 + postcss: 8.5.26 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.25': @@ -4690,6 +4545,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + baseline-browser-mapping@2.8.31: {} boolbase@1.0.0: {} @@ -4699,9 +4556,9 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@5.0.9: dependencies: - balanced-match: 1.0.2 + balanced-match: 4.0.4 browserslist@4.28.0: dependencies: @@ -5168,9 +5025,9 @@ snapshots: eslint: 9.39.1 eslint-compat-utils: 0.5.1(eslint@9.39.1) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1): dependencies: - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/types': 8.66.0 comment-parser: 1.4.1 debug: 4.4.3 eslint: 9.39.1 @@ -5181,7 +5038,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -5216,7 +5073,7 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-n@17.23.1(eslint@9.39.1)(typescript@7.0.2): + eslint-plugin-n@17.23.1(eslint@9.39.1)(typescript@6.0.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) enhanced-resolve: 5.18.3 @@ -5227,16 +5084,16 @@ snapshots: globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.3 - ts-declaration-location: 1.0.7(typescript@7.0.2) + ts-declaration-location: 1.0.7(typescript@6.0.3) transitivePeerDependencies: - typescript eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@4.15.1(eslint@9.39.1)(typescript@7.0.2): + eslint-plugin-perfectionist@4.15.1(eslint@9.39.1)(typescript@6.0.3): dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) eslint: 9.39.1 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -5289,11 +5146,11 @@ snapshots: semver: 7.7.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1): + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1): dependencies: eslint: 9.39.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@7.0.2))(eslint@9.39.1)(typescript@7.0.2) + '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@9.39.1)(typescript@6.0.3))(eslint@9.39.1)(typescript@6.0.3) eslint-plugin-vue@9.33.0(eslint@9.39.1): dependencies: @@ -5340,6 +5197,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} + eslint@9.39.1: dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) @@ -5427,6 +5286,8 @@ snapshots: fast-uri@3.1.0: {} + fast-uri@3.1.5: {} + fault@2.0.1: dependencies: format: 0.2.2 @@ -5435,6 +5296,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -6165,13 +6030,13 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@3.1.2: + minimatch@10.2.6: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 5.0.9 - minimatch@9.0.5: + minimatch@3.1.2: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 1.1.12 mlly@1.8.0: dependencies: @@ -6188,7 +6053,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.18: {} napi-postinstall@0.3.4: {} @@ -6337,11 +6202,11 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.2): + postcss-load-config@6.0.1(postcss@8.5.26)(tsx@4.20.6)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.26 tsx: 4.20.6 yaml: 2.8.2 @@ -6350,9 +6215,9 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.6: + postcss@8.5.26: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -6665,6 +6530,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + toml-eslint-parser@0.10.0: dependencies: eslint-visitor-keys: 3.4.3 @@ -6679,14 +6549,14 @@ snapshots: ts-algebra@1.2.2: {} - ts-api-utils@2.1.0(typescript@7.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 7.0.2 + typescript: 6.0.3 - ts-declaration-location@1.0.7(typescript@7.0.2): + ts-declaration-location@1.0.7(typescript@6.0.3): dependencies: picomatch: 4.0.3 - typescript: 7.0.2 + typescript: 6.0.3 ts-interface-checker@0.1.13: {} @@ -6694,7 +6564,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(postcss@8.5.6)(tsx@4.20.6)(typescript@7.0.2)(yaml@2.8.2): + tsup@8.5.1(postcss@8.5.26)(tsx@4.20.6)(typescript@6.0.3)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.0) cac: 6.7.14 @@ -6705,7 +6575,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.2) + postcss-load-config: 6.0.1(postcss@8.5.26)(tsx@4.20.6)(yaml@2.8.2) resolve-from: 5.0.0 rollup: 4.53.3 source-map: 0.7.6 @@ -6714,8 +6584,8 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.6 - typescript: 7.0.2 + postcss: 8.5.26 + typescript: 6.0.3 transitivePeerDependencies: - jiti - supports-color @@ -6774,28 +6644,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@7.0.2: - optionalDependencies: - '@typescript/typescript-aix-ppc64': 7.0.2 - '@typescript/typescript-darwin-arm64': 7.0.2 - '@typescript/typescript-darwin-x64': 7.0.2 - '@typescript/typescript-freebsd-arm64': 7.0.2 - '@typescript/typescript-freebsd-x64': 7.0.2 - '@typescript/typescript-linux-arm': 7.0.2 - '@typescript/typescript-linux-arm64': 7.0.2 - '@typescript/typescript-linux-loong64': 7.0.2 - '@typescript/typescript-linux-mips64el': 7.0.2 - '@typescript/typescript-linux-ppc64': 7.0.2 - '@typescript/typescript-linux-riscv64': 7.0.2 - '@typescript/typescript-linux-s390x': 7.0.2 - '@typescript/typescript-linux-x64': 7.0.2 - '@typescript/typescript-netbsd-arm64': 7.0.2 - '@typescript/typescript-netbsd-x64': 7.0.2 - '@typescript/typescript-openbsd-arm64': 7.0.2 - '@typescript/typescript-openbsd-x64': 7.0.2 - '@typescript/typescript-sunos-x64': 7.0.2 - '@typescript/typescript-win32-arm64': 7.0.2 - '@typescript/typescript-win32-x64': 7.0.2 + typescript@6.0.3: {} ufo@1.6.1: {} From 45f24e1640ceb121b556f6c9ea4e2f2377e7bc84 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:33:40 -0400 Subject: [PATCH 16/17] chore(deps): use the published redocly-cli instead of a local link --- package.json | 2 +- pnpm-lock.yaml | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e4211ce6..a67223af 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@actions/core": "^1.11.1", "@ariesclark/eslint-config": "^3.1.1", "@jamesacarr/eslint-formatter-github-actions": "^0.2.0", - "@redocly/cli": "link:../redocly-cli/packages/cli", + "@redocly/cli": "^2.46.0", "@redocly/openapi-core": "^2.41.2", "@stoplight/spectral-core": "^1.20.0", "@stoplight/spectral-formats": "^1.8.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ec7aec4..8e21bc02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^0.2.0 version: 0.2.0 '@redocly/cli': - specifier: link:../redocly-cli/packages/cli - version: link:../redocly-cli/packages/cli + specifier: ^2.46.0 + version: 2.46.0 '@redocly/openapi-core': specifier: ^2.41.2 version: 2.41.2 @@ -881,6 +881,11 @@ packages: '@redocly/ajv@8.18.3': resolution: {integrity: sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==} + '@redocly/cli@2.46.0': + resolution: {integrity: sha512-Hx4dIYwFhMkE6fZXDl0TwuVsvE8INX7dzEOgAcEhl0mhTkHC95o/rhUTlVLbNRg4mWHQ27jbdgKXPZBJJANWYA==} + engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} + hasBin: true + '@redocly/config@0.52.0': resolution: {integrity: sha512-e/++L27tRgo35GVCy4ivy+uqHi/ksg4KnhlYzj5FTJ9OokuyX18B0mJm0SUXLBih9VIQMgSk6tXsyYmhg5OsIQ==} @@ -3954,6 +3959,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + '@redocly/cli@2.46.0': {} + '@redocly/config@0.52.0': dependencies: json-schema-to-ts: 2.7.2 From 48e486b629822496b4af6d9d8bfc9cd3d5357a76 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 8 Aug 2026 19:43:01 -0400 Subject: [PATCH 17/17] docs(test): point the env example at test/.env and the login workflow --- test/.env.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/.env.example b/test/.env.example index 0a5c91fb..582ea83d 100644 --- a/test/.env.example +++ b/test/.env.example @@ -1,8 +1,8 @@ -# Credentials for the conformance suite. Copy to `conformance/.env` and fill in. +# Credentials for the conformance suite. Copy to `test/.env` and fill in. # `.env` is gitignored; this example is not. -# Login, used by `pnpm conformance:login` to mint a session. That step also -# derives the account's id and display name, so neither is set here. +# Login, used by the `login` workflow in `pnpm test` to mint a session. That +# step also derives the account's id and display name, so neither is set here. VRCHAT_EMAIL= VRCHAT_PASSWORD= VRCHAT_TOTP_SECRET=