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..304f4f73 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,148 @@ +# 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. + +## 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 +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/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index d079c6ad..d1dcd230 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -261,6 +261,13 @@ favoriteGroupType: in: path schema: $ref: ./schemas/FavoriteType.yaml +favoriteGroupTypeQuery: + name: type + description: Filter to a single favorite group type. + required: false + in: query + schema: + $ref: ./schemas/FavoriteType.yaml favoriteId: name: favoriteId description: Must be a valid favorite ID. @@ -783,7 +790,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: @@ -818,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 5bcb2a87..2ecc87cb 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -314,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}": @@ -344,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: @@ -458,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}/removeTags": - $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1removeTags" "/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..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: [] @@ -399,6 +399,38 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/InvalidAdminCredentialsError.yaml + /oauth/redirectCode: + get: + operationId: getOAuthRedirectCode + summary: Get OAuth Redirect Code + description: Generate a short-lived OAuth redirect code for the current session. + 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: Generate a token for the specified 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 "/users/{userId}/delete": parameters: - $ref: ../parameters.yaml#/userId diff --git a/openapi/components/paths/avatars.yaml b/openapi/components/paths/avatars.yaml index 24ade939..f45bc233 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: @@ -148,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 @@ -165,14 +169,18 @@ paths: responses: "200": $ref: ../responses/avatars/AvatarResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml 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: @@ -183,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 @@ -201,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 @@ -219,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 @@ -237,13 +245,12 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/selectFallback": parameters: - $ref: ../parameters.yaml#/avatarId put: operationId: selectFallbackAvatar - deprecated: true summary: Select Fallback Avatar description: Switches into that avatar as your fallback avatar. tags: @@ -258,14 +265,15 @@ 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 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..79a8af6e 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -46,6 +46,7 @@ paths: - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/calendarDiscoveryNextCursor security: + - {} - authCookie: [] responses: "200": @@ -64,6 +65,7 @@ paths: - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset security: + - {} - authCookie: [] responses: "200": @@ -157,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: @@ -170,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 @@ -189,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 @@ -222,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 c91760ee..d78e7aa0 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,9 +216,11 @@ 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: Return the current user's eligibility to become a seller. tags: + - deprecated - economy security: - authCookie: [] @@ -223,6 +229,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 +269,14 @@ 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: List a seller's stores, adjusted for management views. tags: - economy security: @@ -276,8 +284,12 @@ paths: responses: "200": $ref: ../responses/economy/StoreListResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/economy/StoresUnavailableError.yaml "/licenseGroups/{licenseGroupId}": parameters: - $ref: ../parameters.yaml#/licenseGroupId @@ -298,7 +310,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 +347,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 +450,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 giftable subscriptions instead of standard ones. + required: false + in: query + schema: + type: boolean + - name: recurring + description: Return recurring subscriptions instead of standard ones. + required: false + in: query + schema: + type: boolean security: - authCookie: [] responses: @@ -449,9 +477,11 @@ paths: /tilia/status: get: operationId: getTiliaStatus + deprecated: true summary: Get Tilia Status - description: Gets the status of Tilia integration + description: Return the Tilia integration status. tags: + - deprecated - economy security: - authCookie: [] @@ -460,6 +490,8 @@ paths: $ref: ../responses/economy/TiliaStatusResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml /tokenBundles: get: operationId: getTokenBundles @@ -510,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: @@ -525,9 +557,11 @@ paths: - $ref: ../parameters.yaml#/userId get: operationId: getBalanceEarnings + deprecated: true summary: Get Balance Earnings - description: Gets the balance of a user from earnings + description: Return the user's balance from earnings. tags: + - deprecated - economy security: - authCookie: [] @@ -536,6 +570,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 +634,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 +683,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 +717,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,9 +726,11 @@ 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: Return the user's Tilia TOS agreement status. tags: + - deprecated - economy security: - authCookie: [] @@ -695,11 +739,15 @@ 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: Update the user's Tilia TOS agreement status. tags: + - deprecated - economy requestBody: content: @@ -713,15 +761,19 @@ 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: Return the user's subscription credit eligibility. tags: + - deprecated - economy security: - authCookie: [] @@ -730,6 +782,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..e1f19f02 100644 --- a/openapi/components/paths/favorites.yaml +++ b/openapi/components/paths/favorites.yaml @@ -73,9 +73,10 @@ 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. + description: The user whose favorite groups to return. Must be a user ID. in: query schema: type: string @@ -162,10 +163,12 @@ paths: responses: "200": $ref: ../responses/favorites/FavoriteRemovedSuccess.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "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 9571e686..2ba6e9d2 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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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..f57b91f6 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/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml /instances/recent: @@ -64,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 @@ -79,6 +81,7 @@ paths: tags: - instances security: + - {} - authCookie: [] responses: "200": @@ -119,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 @@ -131,6 +134,7 @@ paths: tags: - instances security: + - {} - authCookie: [] responses: "200": diff --git a/openapi/components/paths/invite.yaml b/openapi/components/paths/invite.yaml index 141d2e44..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 @@ -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..3ad1f883 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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.yaml diff --git a/openapi/components/paths/miscellaneous.yaml b/openapi/components/paths/miscellaneous.yaml index 82cd5201..76ecb12f 100644 --- a/openapi/components/paths/miscellaneous.yaml +++ b/openapi/components/paths/miscellaneous.yaml @@ -58,15 +58,17 @@ 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: [] 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/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 34f19085..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 @@ -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": @@ -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 1da8071b..2c86ec23 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -62,11 +62,14 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml 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,12 +83,14 @@ paths: responses: "200": $ref: ../responses/props/PropResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteProp summary: Delete Prop @@ -102,15 +107,17 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/props/{propId}/publish": parameters: - $ref: ../parameters.yaml#/propId get: operationId: getPropPublishStatus + deprecated: true summary: Get Prop Publish Status - description: Returns a PropPublishStatus object. + description: Return the PropPublishStatus object. `/props/{propId}` is still served. tags: + - deprecated - props security: - authCookie: [] @@ -122,12 +129,14 @@ 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. `/props/{propId}` is still served. tags: + - deprecated - props security: - authCookie: [] @@ -139,12 +148,14 @@ 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. `/props/{propId}` is still served. tags: + - deprecated - props security: - authCookie: [] @@ -156,7 +167,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..1cb6f72d 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,8 +127,10 @@ 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: + - deprecated - users parameters: - name: search @@ -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/ResourceNotFoundError.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/ResourceNotFoundError.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": @@ -571,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: @@ -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..ac46011b 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: @@ -166,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 @@ -183,14 +185,18 @@ paths: responses: "200": $ref: ../responses/worlds/WorldResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml 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: @@ -201,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 @@ -226,14 +232,44 @@ 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: |- + Remove 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 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: [] @@ -241,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 @@ -260,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 @@ -278,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 @@ -293,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 @@ -308,31 +344,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml - "/worlds/{worldId}/removeTags": - parameters: - - $ref: ../parameters.yaml#/worldId - post: - operationId: removeWorldTags - summary: Remove World Tags - description: Removes tags from the world's profile - 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 + $ref: ../responses/ResourceNotFoundError.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..d8ef5f1d 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,6 +31,12 @@ properties: minLength: 1 platform: $ref: ../schemas/Platform.yaml + previewYoutubeId: + type: string + nullable: true + recommendedCapacity: + type: integer + example: 4 releaseStatus: $ref: ../schemas/ReleaseStatus.yaml tags: @@ -42,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/RequestValidationError.yaml b/openapi/components/responses/RequestValidationError.yaml new file mode 100644 index 00000000..6e1c006f --- /dev/null +++ b/openapi/components/responses/RequestValidationError.yaml @@ -0,0 +1,24 @@ +description: >- + 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: + Invalid Field: + value: + 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 new file mode 100644 index 00000000..f43bae09 --- /dev/null +++ b/openapi/components/responses/RouteNotImplementedError.yaml @@ -0,0 +1,10 @@ +description: VRChat does not serve this route. 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..98d9524f --- /dev/null +++ b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml @@ -0,0 +1,5 @@ +description: Return 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..6dde2e1d --- /dev/null +++ b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml @@ -0,0 +1,11 @@ +description: Error response when the requested SSO provider is unsupported. +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..627ead59 --- /dev/null +++ b/openapi/components/responses/authentication/SsoTokenResponse.yaml @@ -0,0 +1,5 @@ +description: Return a token for the service. +content: + application/json: + schema: + $ref: ../../schemas/SsoToken.yaml 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 new file mode 100644 index 00000000..ce3be238 --- /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 an account never 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..54bdf83e --- /dev/null +++ b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when requesting another user's product listings. +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..7da81879 --- /dev/null +++ b/openapi/components/responses/economy/StoresUnavailableError.yaml @@ -0,0 +1,11 @@ +description: Error response when the seller's stores are unavailable 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/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/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/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 new file mode 100644 index 00000000..787128e5 --- /dev/null +++ b/openapi/components/responses/notifications/HideNotificationSuccess.yaml @@ -0,0 +1,11 @@ +description: Response from successfully 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/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/users/PersistenceOwnershipError.yaml b/openapi/components/responses/users/PersistenceOwnershipError.yaml new file mode 100644 index 00000000..0022876f --- /dev/null +++ b/openapi/components/responses/users/PersistenceOwnershipError.yaml @@ -0,0 +1,12 @@ +description: >- + 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: + 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..35a3af97 --- /dev/null +++ b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when updating a user other than yourself. +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/UserResponse.yaml b/openapi/components/responses/users/UserResponse.yaml index 36b321a8..7e1ca8b9 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: |- + Return a single User object. + + Requesting your own ID returns your full `CurrentUser` record instead, carrying + the private fields (`emailVerified`, `steamDetails`, `twoFactorAuthEnabled`, …) + that never appear in responses 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/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 - + 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..8527effa 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: @@ -229,14 +270,15 @@ 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: 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..d7e680dd 100644 --- a/openapi/components/schemas/GroupAnnouncement.yaml +++ b/openapi/components/schemas/GroupAnnouncement.yaml @@ -1,5 +1,8 @@ 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 @@ -8,6 +11,9 @@ properties: type: string nullable: true format: date-time + editorId: + $ref: ./UserID.yaml + nullable: true groupId: $ref: ./GroupID.yaml 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..4f9f8ecf 100644 --- a/openapi/components/schemas/GroupRole.yaml +++ b/openapi/components/schemas/GroupRole.yaml @@ -4,12 +4,18 @@ properties: createdAt: type: string format: date-time + defaultRole: + type: boolean + default: false description: type: string groupId: $ref: ./GroupID.yaml id: $ref: ./GroupRoleID.yaml + isAddedOnJoin: + type: boolean + default: false isManagementRole: 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..83728cd3 100644 --- a/openapi/components/schemas/InventoryMetadata.yaml +++ b/openapi/components/schemas/InventoryMetadata.yaml @@ -20,3 +20,5 @@ 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..cd0aabef 100644 --- a/openapi/components/schemas/JamSubmission.yaml +++ b/openapi/components/schemas/JamSubmission.yaml @@ -15,9 +15,8 @@ properties: $ref: ../schemas/JamSubmissionID.yaml jamId: $ref: ../schemas/JamID.yaml - ratingScore: + ratingsScore: type: integer - minimum: 0 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..48f23da9 100644 --- a/openapi/components/schemas/MutualFriend.yaml +++ b/openapi/components/schemas/MutualFriend.yaml @@ -4,6 +4,13 @@ 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 currentAvatarImageUrl: $ref: ./CurrentAvatarImageUrl.yaml currentAvatarTags: @@ -14,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/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/NotificationDetailEmpty.yaml b/openapi/components/schemas/NotificationDetailEmpty.yaml deleted file mode 100644 index fc874d4a..00000000 --- a/openapi/components/schemas/NotificationDetailEmpty.yaml +++ /dev/null @@ -1,2 +0,0 @@ -title: NotificationDetailEmpty -type: object 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 8f673483..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 @@ -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 deleted file mode 100644 index 61db4d34..00000000 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ /dev/null @@ -1,2 +0,0 @@ -title: NotificationV2DataEmpty -type: object diff --git a/openapi/components/schemas/OAuthRedirectCode.yaml b/openapi/components/schemas/OAuthRedirectCode.yaml new file mode 100644 index 00000000..fddd2817 --- /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 + 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 565f7ddb..0447a6dc 100644 --- a/openapi/components/schemas/PrivateProfile.yaml +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -3,12 +3,15 @@ type: object properties: activity: $ref: ./PrivateProfileActivity.yaml + friendRequestStatus: + $ref: ./FriendRequestStatus.yaml id: $ref: ./UserID.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..43f8af9b --- /dev/null +++ b/openapi/components/schemas/RouteNotImplemented.yaml @@ -0,0 +1,18 @@ +title: RouteNotImplemented +type: object +description: >- + 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 + enum: + - The endpoint you're looking for is not implemented by our system. + status_code: + type: integer + enum: + - 404 +required: + - error + - status_code diff --git a/openapi/components/schemas/SentNotification.yaml b/openapi/components/schemas/SentNotification.yaml index 1f49a160..2f660d59 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 @@ -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/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..e10e67fb 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: @@ -104,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: 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..8e9b19d7 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 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. diff --git a/package.json b/package.json index d4508a45..a67223af 100644 --- a/package.json +++ b/package.json @@ -4,41 +4,39 @@ "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": "^2.46.0", + "@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", + "typescript": "^6.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd6d036e..8e21bc02 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.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 '@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: ^2.46.0 + version: 2.46.0 '@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,27 @@ 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 + typescript: + specifier: ^6.0.3 + version: 6.0.3 packages: @@ -144,12 +138,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: @@ -169,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 @@ -186,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': @@ -200,10 +192,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 +415,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'} @@ -758,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} @@ -768,45 +753,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 +806,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 +822,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 +834,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 +871,28 @@ 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.18.1': + resolution: {integrity: sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==} - '@redocly/ajv@8.17.1': - resolution: {integrity: sha512-EDtsGZS964mf9zAUXAl9Ew16eYbeyAFWhsPr0fX6oaJxgd8rApYlPBf0joyhnUHz88WxrigyFtTaqqzXNzPgqw==} + '@redocly/ajv@8.18.3': + resolution: {integrity: sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==} - '@redocly/cli@2.12.0': - resolution: {integrity: sha512-/q8RnBe+Duo+XYFCG8LnaD0kroGZ8MoS6575Xq59tCgjaCL16F+pZZ75xNBU2oXfEypJClNz/6ilc2G0q1+tlw==} + '@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.22.2': - resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} + '@redocly/config@0.52.0': + resolution: {integrity: sha512-e/++L27tRgo35GVCy4ivy+uqHi/ksg4KnhlYzj5FTJ9OokuyX18B0mJm0SUXLBih9VIQMgSk6tXsyYmhg5OsIQ==} - '@redocly/config@0.40.0': - resolution: {integrity: sha512-MZQZs7QEGnue3rVN9Q9QvDbcGjesxbpKXUvDeckS69R1xjtgsnT9B39VA25zmwSJtgUeA9ST+sMf9GxIqixNbw==} - - '@redocly/config@0.41.0': - resolution: {integrity: sha512-8yJ2e+ex8KVF25zijdpDbAEjyubk7NLfHsLI8h0MUnLEo2iEg6rTCDT9Qw71XDqd5UlXvfJb0Z0h6dd+Y6pWLw==} - - '@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/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 +1029,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 +1053,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 +1073,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 +1098,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,75 +1125,69 @@ 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==} '@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} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -1573,10 +1327,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 +1366,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 +1391,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 +1399,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'} @@ -1678,35 +1406,23 @@ 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 - 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==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - 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'} + 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==} @@ -1717,9 +1433,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 +1458,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 +1486,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 +1501,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 +1511,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 +1523,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 +1536,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 +1554,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 +1575,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 +1601,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 +1615,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 +1630,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 +1683,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 +1814,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} @@ -2297,6 +1880,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} @@ -2336,9 +1923,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 +1934,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 +1944,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,18 +1953,11 @@ 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==} + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2405,10 +1975,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 +1997,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 +2005,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 +2040,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 +2050,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 +2087,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 +2121,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 +2152,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 +2175,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 +2219,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 +2231,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 +2273,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 +2288,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 +2319,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 +2347,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 +2401,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 +2453,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 +2540,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'} @@ -3088,64 +2548,24 @@ 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@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==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 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 @@ -3161,17 +2581,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 +2594,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 +2604,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 +2623,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 +2651,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 +2676,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 +2687,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 +2718,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,35 +2748,14 @@ 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==} + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: 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 +2763,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 +2771,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 +2783,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 +2807,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 +2823,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 +2843,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 +2856,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 +2868,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 +2876,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 +2892,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 +2907,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 +2926,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 +2955,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 +2967,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 +2980,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 +3005,25 @@ 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'} + 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} + totp-generator@2.0.1: + resolution: {integrity: sha512-50DiKmv9zKTPzCgWOqQYVBMvxh+tpL9O3IUFIqzGUlFXzJyb/IQZac8bonXudvLbfuDY8laZ9qTDX+yAvTBNSQ==} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -3829,8 +3034,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' @@ -3843,15 +3048,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 +3114,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==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} 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 +3133,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 +3158,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 +3174,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 +3217,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 +3240,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 +3257,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 +3278,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.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@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@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@5.9.3))(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@5.9.3) + 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@5.9.3) + 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@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.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) @@ -4178,7 +3317,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 +3334,14 @@ snapshots: '@antfu/utils@0.7.10': {} - '@apidevtools/json-schema-ref-parser@15.1.2(@types/json-schema@7.0.15)': + '@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: - '@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)': - 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.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@5.9.3)(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' @@ -4247,20 +3380,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: @@ -4335,10 +3470,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,18 +3634,10 @@ 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 - '@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 @@ -4681,85 +3804,17 @@ snapshots: eslint: 9.39.1 ignore: 5.3.2 - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.1)': dependencies: eslint: 9.39.1 eslint-visitor-keys: 3.4.3 - '@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)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': 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-visitor-keys: 3.4.3 - '@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-community/regexpp@4.12.2': {} '@eslint/compat@1.4.1(eslint@9.39.1)': dependencies: @@ -4832,10 +3887,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 +3898,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 +3906,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,257 +3943,41 @@ 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': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@opentelemetry/api-logs@0.202.0': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api@1.9.0': {} - - '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.34.0 - - '@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) - - '@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': + '@redocly/ajv@8.18.1': dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.1.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js-replace: 1.0.1 - '@redocly/ajv@8.17.1': + '@redocly/ajv@8.18.3': 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/cli@2.46.0': {} - '@redocly/config@0.41.0': + '@redocly/config@0.52.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)': + '@redocly/openapi-core@2.41.2': dependencies: - '@redocly/ajv': 8.17.1 - '@redocly/config': 0.41.0 - ajv-formats: 3.0.1(ajv@8.17.1) + '@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: 4.1.1 - picomatch: 4.0.3 + js-yaml: 5.2.2 + picomatch: 4.0.5 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 @@ -5260,30 +4084,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 +4170,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 +4217,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 +4226,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@6.0.3)': dependencies: - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@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 @@ -5504,8 +4255,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,106 +4277,100 @@ 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.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@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/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) - '@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@5.9.3) - typescript: 5.9.3 + 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@5.9.3)': + '@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@5.9.3) - '@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: 5.9.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.66.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) - '@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: 5.9.3 + 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@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)': dependencies: - typescript: 5.9.3 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': + '@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@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@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@5.9.3) - typescript: 5.9.3 + 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@5.9.3)': + '@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3)': 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/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@5.9.3) - typescript: 5.9.3 + 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@5.9.3)': + '@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@5.9.3) + '@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: 5.9.3 + 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-eslint/types': 8.66.0 + eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -5688,19 +4431,19 @@ 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@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@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: 5.9.3 + 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 @@ -5713,14 +4456,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': @@ -5740,8 +4483,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 +4495,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 +4515,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,40 +4542,19 @@ 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 balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.31: {} + balanced-match@4.0.4: {} - 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: {} + baseline-browser-mapping@2.8.31: {} boolbase@1.0.0: {} @@ -5852,13 +4563,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 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 + balanced-match: 4.0.4 browserslist@4.28.0: dependencies: @@ -5870,8 +4577,6 @@ snapshots: builtin-modules@3.3.0: {} - builtins@1.0.3: {} - bun-types@1.3.3: dependencies: '@types/node': 24.10.1 @@ -5900,51 +4605,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 +4647,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 +4655,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 +4665,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 +4673,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 +4699,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 +4745,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 +4769,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 +4787,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 +4797,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 +4909,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,9 +5032,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@5.9.3))(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 @@ -6437,7 +5045,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.66.0(eslint@9.39.1)(typescript@6.0.3) transitivePeerDependencies: - supports-color @@ -6472,7 +5080,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@6.0.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) enhanced-resolve: 5.18.3 @@ -6481,121 +5089,29 @@ snapshots: get-tsconfig: 4.13.0 globals: 15.15.0 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 + ignore: 5.3.2 + semver: 7.7.3 + ts-declaration-location: 1.0.7(typescript@6.0.3) transitivePeerDependencies: - - supports-color + - typescript - 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 - transitivePeerDependencies: - - supports-color + eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-react-naming-convention@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-plugin-perfectionist@4.15.1(eslint@9.39.1)(typescript@6.0.3): + dependencies: + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/utils': 8.66.0(eslint@9.39.1)(typescript@6.0.3) 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 +5153,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.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@5.9.3))(eslint@9.39.1)(typescript@5.9.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) eslint-plugin-vue@9.33.0(eslint@9.39.1): dependencies: @@ -6688,6 +5204,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) @@ -6755,47 +5273,27 @@ 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 + fast-uri@3.1.5: {} fault@2.0.1: dependencies: @@ -6805,14 +5303,14 @@ 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 - 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 +5338,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 +5346,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -6905,11 +5386,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 +5398,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 +5427,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 +5453,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 +5475,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 +5503,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 +5549,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 +5558,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 +5601,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 +5611,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 +5629,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 +5662,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 +5708,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 +5833,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,38 +6031,19 @@ 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: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - - minimatch@5.1.6: + minimatch@10.2.6: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 5.0.9 - minimatch@9.0.5: + minimatch@3.1.2: dependencies: - brace-expansion: 2.0.2 - - minimist@1.2.8: {} - - minipass@7.1.2: {} + brace-expansion: 1.1.12 mlly@1.8.0: dependencies: @@ -7681,24 +6052,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: @@ -7707,7 +6060,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: {} @@ -7715,8 +6068,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 +6078,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 +6096,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 +6115,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 +6124,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 +6148,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 +6173,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,19 +6205,15 @@ 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: {} - 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 @@ -7941,72 +6222,18 @@ 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: + postcss@8.5.26: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 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 +6247,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 +6264,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 +6288,6 @@ snapshots: require-from-string@2.0.2: {} - reserved@0.1.2: {} - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -8120,12 +6300,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 +6328,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 +6336,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 +6349,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 +6359,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 +6381,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 +6415,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 +6446,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 +6484,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 +6510,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 +6530,48 @@ 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: + tinyglobby@0.2.17: dependencies: - is-number: 7.0.0 + 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 + 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.5.0(typescript@6.0.3): dependencies: - typescript: 5.9.3 + typescript: 6.0.3 - ts-declaration-location@1.0.7(typescript@5.9.3): + ts-declaration-location@1.0.7(typescript@6.0.3): dependencies: picomatch: 4.0.3 - typescript: 5.9.3 + typescript: 6.0.3 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.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 @@ -8518,7 +6582,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 @@ -8527,8 +6591,8 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.6 - typescript: 5.9.3 + postcss: 8.5.26 + typescript: 6.0.3 transitivePeerDependencies: - jiti - supports-color @@ -8587,13 +6651,10 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.9.3: {} + typescript@6.0.3: {} ufo@1.6.1: {} - uglify-js@3.19.3: - optional: true - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -8607,8 +6668,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 +6719,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 +6734,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 +6805,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 +6824,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 +6840,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..582ea83d --- /dev/null +++ b/test/.env.example @@ -0,0 +1,15 @@ +# Credentials for the conformance suite. Copy to `test/.env` and fill in. +# `.env` is gitignored; this example is not. + +# 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= + +# 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..5a9d31ab --- /dev/null +++ b/test/arazzo.yaml @@ -0,0 +1,10744 @@ +# 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-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: + - 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" \ + "$@"