diff --git a/packages/core/src/codegen/generator.ts b/packages/core/src/codegen/generator.ts index d179ba0c3..34ee49ace 100644 --- a/packages/core/src/codegen/generator.ts +++ b/packages/core/src/codegen/generator.ts @@ -678,7 +678,15 @@ export const generateService = ( spec.memberTsType?.(info, tsRefFn) ?? (spec.extraBindings ?? []).find( (b) => b.binding === info.binding && b.tsType !== undefined, - )?.tsType; + )?.tsType ?? + // Whole-body binary payloads (`smithy.api#httpPayload` targeting + // `smithy.api#Blob`) accept every raw form the REST protocol sends + // verbatim (see buildRequest's rawBody branch); the JSON-flavor prelude + // would otherwise type them as a bare `string`, inviting JSON-corrupted + // uploads. Providers can still override via `memberTsType`. + (info.binding === "rawBody" && info.target === "smithy.api#Blob" + ? "Blob | Uint8Array | ArrayBuffer | string" + : undefined); const emitMember = (info: EmittedMember, selfIdx: number): string => { let expr = ref(info.target, selfIdx); diff --git a/packages/core/src/codegen/openapi.ts b/packages/core/src/codegen/openapi.ts index 3450482db..61224363e 100644 --- a/packages/core/src/codegen/openapi.ts +++ b/packages/core/src/codegen/openapi.ts @@ -16,7 +16,10 @@ * as cookie params always are), * body properties flattened alongside * (labels win, then query, then headers, then body); - * non-object bodies become a sole `body` member with `smithy.api#httpPayload` + * non-object bodies become a sole `body` member with `smithy.api#httpPayload`; + * binary bodies (application/octet-stream, or an explicit + * `type: string, format: binary` schema) become a sole `smithy.api#Blob` + * payload member with the media type on the http trait's `bodyMediaType` * • `$ref`s become NAMED shapes (`components/schemas/X` → `#X`), reused * across operations; anonymous nested objects synthesize names from the * parent + member path @@ -196,6 +199,7 @@ const PRELUDE = { Double: "smithy.api#Double", Integer: "smithy.api#Integer", Document: "smithy.api#Document", + Blob: "smithy.api#Blob", } as const; /** snake/kebab/space/camel → PascalCase identifier (inner caps preserved). */ @@ -883,6 +887,18 @@ const convertSchema = ( } }; +/** + * Whether a schema describes raw binary content: an explicit binary string + * (`type: string, format: binary` — OAS 3.0's file-upload idiom). Used only + * to classify request-body media types the JSON/form/multipart precedence + * didn't claim; a schema-less entry relies on its media type instead. + */ +const isBinarySchema = (ctx: Ctx, def: any): boolean => { + const r = deref(ctx, def); + if (!r || typeof r !== "object") return false; + return typeOf(r) === "string" && r.format === "binary"; +}; + /** Whether a property is a sensitive string (x-sensitive or name pattern). */ const isSensitiveProperty = (ctx: Ctx, name: string, def: any): boolean => { const r = deref(ctx, def); @@ -1315,10 +1331,12 @@ export const convertOpenApiToSmithy = ( } } - // ---- Request body (json > form-urlencoded > multipart) ---- + // ---- Request body (json > form-urlencoded > multipart > binary) ---- let contentType: "form-urlencoded" | "multipart" | undefined; let bodySchema: any; let bodyRequired = false; + let binaryMediaType: string | undefined; + let binaryBodyDoc: string | undefined; if (version === "2.0") { const bodyParam = params.find((p) => p.in === "body"); bodySchema = bodyParam?.schema; @@ -1337,6 +1355,34 @@ export const convertOpenApiToSmithy = ( } else if (content["multipart/form-data"]) { bodySchema = content["multipart/form-data"].schema; contentType = "multipart"; + } else { + // Binary request body (raw upload): `application/octet-stream`, or + // any other media type whose schema is an explicit binary string + // (`type: string, format: binary`). Becomes a sole Blob `body` + // member (`smithy.api#httpPayload`) sent VERBATIM under the + // declared media type — `bodyMediaType` on the `smithy.api#http` + // trait routes it down the REST protocol's raw-send path, since + // JSON-encoding file bytes would corrupt every upload. + const binary = Object.entries(content).find( + ([mt, media]) => + mt === "application/octet-stream" || + isBinarySchema(ctx, (media as any)?.schema), + ); + if (binary !== undefined) { + // A wildcard media type (`*/*`, `application/*`) is not a valid + // Content-Type to send — fall back to octet-stream. + binaryMediaType = binary[0].includes("*") + ? "application/octet-stream" + : binary[0]; + const schemaDoc = deref(ctx, (binary[1] as any)?.schema); + binaryBodyDoc = + (typeof rb?.description === "string" + ? rb.description + : undefined) ?? + (typeof schemaDoc?.description === "string" + ? schemaDoc.description + : undefined); + } } } if (bodySchema !== undefined) { @@ -1379,6 +1425,19 @@ export const convertOpenApiToSmithy = ( }); } } + } else if (binaryMediaType !== undefined) { + // Binary body (see the content-type precedence above) → sole Blob + // payload member; `bodyMediaType` rides the http trait below. + addMember("body", { + target: PRELUDE.Blob, + traits: { + "smithy.api#httpPayload": {}, + ...(bodyRequired ? { "smithy.api#required": {} } : {}), + ...(binaryBodyDoc + ? { "smithy.api#documentation": binaryBodyDoc } + : {}), + }, + }); } // ---- Input shape ---- @@ -1489,6 +1548,9 @@ export const convertOpenApiToSmithy = ( code: 200, }; if (contentType === "multipart") httpTrait.contentType = "multipart"; + if (binaryMediaType !== undefined) { + httpTrait.bodyMediaType = binaryMediaType; + } const traits: Record = { "smithy.api#http": httpTrait }; const documentation = opDoc(op); if (documentation) traits["smithy.api#documentation"] = documentation; diff --git a/packages/core/src/protocol-http.ts b/packages/core/src/protocol-http.ts index 14b21696f..b2827e438 100644 --- a/packages/core/src/protocol-http.ts +++ b/packages/core/src/protocol-http.ts @@ -17,6 +17,7 @@ import { formDataFileSymbol, getErrorMatchers, headerSymbol, + hostLabelSymbol, httpBodySymbol, httpSymbol, keyDictionarySymbol, @@ -430,10 +431,14 @@ export const buildRequest = ({ | undefined; const headers: Record = { ...baseHeaders }; + // The operation's declared Accept, when the API serves several media types + // (member-bound headers can still override it below). + if (http.accept !== undefined) headers["accept"] = http.accept; const body: Record = {}; let rawBody: unknown; // whole-body member (T.HttpBody) — sent as-is const files: Array = []; const query = new URLSearchParams(); + let base = baseUrl; let uri = http.uri; const consumed = new Set(); let hasBodyMembers = false; @@ -444,6 +449,7 @@ export const buildRequest = ({ const value = inputObj[key]; const isBodyMember = !hasPropAnn(prop, labelSymbol) && + !hasPropAnn(prop, hostLabelSymbol) && !hasPropAnn(prop, headerSymbol) && !hasPropAnn(prop, querySymbol) && !hasPropAnn(prop, deepQuerySymbol); @@ -452,7 +458,20 @@ export const buildRequest = ({ if (hasPropAnn(prop, labelSymbol)) { const token = nameOf(prop, labelSymbol); - uri = uri.replace(`{${token}}`, encodeURIComponent(String(value))); + // Greedy labels (`{token+}`, smithy's multi-segment form) keep their + // `/` separators, encoding each segment individually — path-like keys + // (S3/blob pathnames) would otherwise arrive with `%2F`. + uri = uri + .replace( + `{${token}+}`, + String(value).split("/").map(encodeURIComponent).join("/"), + ) + .replace(`{${token}}`, encodeURIComponent(String(value))); + } else if (hasPropAnn(prop, hostLabelSymbol)) { + // Host labels fill `{token}` placeholders in the ENDPOINT template — + // raw, un-encoded (a template may take a whole origin as its label). + const token = nameOf(prop, hostLabelSymbol); + base = base.replaceAll(`{${token}}`, String(value)); } else if (hasPropAnn(prop, headerSymbol)) { const hName = nameOf(prop, headerSymbol).toLowerCase(); const hVal = String(value); @@ -506,7 +525,7 @@ export const buildRequest = ({ } const qs = query.toString(); - const url = `${baseUrl}${uri}${qs ? `?${qs}` : ""}`; + const url = `${base}${uri}${qs ? `?${qs}` : ""}`; if (process.env.DISTILLED_DEBUG_HTTP) { console.error( `[distilled] ${http.method} ${url}` + @@ -582,34 +601,33 @@ export const buildRequest = ({ ); } else if (rawBody !== undefined && !BODYLESS.has(http.method)) { // Whole-body member (raw arrays/scalars) — sent as the body itself. - // Binary payloads (Blob / ArrayBuffer / Uint8Array) send verbatim - // (raw object uploads — the Content-Type header member, when modeled, - // rides alongside). With a bodyMediaType, the member is a - // preserialized payload (string / bytes) sent verbatim under that - // media type (e.g. application/x-ndjson for Vectorize - // insert/upsert); otherwise it's JSON. + // The effective media type is the modeled Content-Type HEADER member's + // value when one was set (per-call content types — blob/queue payload + // uploads), else the operation's static bodyMediaType (preserialized + // payloads, e.g. application/x-ndjson for Vectorize insert/upsert). + // The explicit type must ride ON THE BODY: `setBody` unconditionally + // rewrites the content-type header from the body metadata (and REMOVES + // it when the body carries none), so a header set beforehand would be + // silently dropped. + const mediaType = headers["content-type"] ?? http.bodyMediaType; if (rawBody instanceof Blob || rawBody instanceof ArrayBuffer) { - // Honor the declared media type (e.g. application/x-ndjson for - // Vectorize insert/upsert) — without it the server may fall back to - // JSON parsing. When no bodyMediaType is modeled the header is left - // untouched (a modeled Content-Type header member rides alongside). request = request.pipe( - HttpClientRequest.setBody( - HttpBody.raw(rawBody, { contentType: http.bodyMediaType }), - ), + HttpClientRequest.setBody(HttpBody.raw(rawBody, { contentType: mediaType })), ); } else if (rawBody instanceof Uint8Array) { request = request.pipe( - HttpClientRequest.setBody( - HttpBody.uint8Array(rawBody, http.bodyMediaType), - ), + HttpClientRequest.setBody(HttpBody.uint8Array(rawBody, mediaType)), + ); + } else if (typeof rawBody === "string" && mediaType !== undefined) { + // A string payload with an explicit media type is preserialized + // content sent verbatim — JSON-quoting it would corrupt the upload. + request = request.pipe( + HttpClientRequest.setBody(HttpBody.text(rawBody, mediaType)), ); } else if (http.bodyMediaType) { request = request.pipe( HttpClientRequest.setBody( - typeof rawBody === "string" - ? HttpBody.text(rawBody, http.bodyMediaType) - : HttpBody.uint8Array(rawBody as Uint8Array, http.bodyMediaType), + HttpBody.uint8Array(rawBody as Uint8Array, http.bodyMediaType), ), ); } else { @@ -641,18 +659,32 @@ export const buildRequest = ({ /** * Whether one matcher matches one wire error: every present field must * match; a matcher (or a message object) with no constraints matches - * nothing. + * nothing. `header` matches when the named response header is present + * (case-insensitive; only checkable when the caller passes headers). */ export const matchesExpression = ( m: ErrorMatcher, code: number | undefined, status: number, message: string, + headers?: Record, ): boolean => { - if (m.code === undefined && m.status === undefined && m.message === undefined) + if ( + m.code === undefined && + m.status === undefined && + m.message === undefined && + m.header === undefined + ) return false; if (m.code !== undefined && m.code !== code) return false; if (m.status !== undefined && m.status !== status) return false; + if (m.header !== undefined) { + if (headers === undefined) return false; + const name = m.header.toLowerCase(); + if (headers[name] === undefined && headers[m.header] === undefined) { + return false; + } + } if (m.message !== undefined) { if (typeof m.message === "string") { if (m.message !== message) return false; @@ -670,17 +702,20 @@ export const matchesExpression = ( const matcherSpecificity = (m: ErrorMatcher): number => (m.code !== undefined ? 1 : 0) + (m.status !== undefined ? 1 : 0) + - (m.message !== undefined ? 1 : 0); + (m.message !== undefined ? 1 : 0) + + (m.header !== undefined ? 1 : 0); /** * Pick the operation's typed error class for a failed response: among all * declared classes whose matchers (see `applyErrorMatchers`) match the wire * failure, the most specific matcher wins (ties break by declaration order). + * `headers` (the response headers) enables `header`-presence matchers. */ export const matchTypedError = ( errorClasses: ReadonlyArray, status: number, errors: ReadonlyArray<{ code?: number; message: string }>, + headers?: Record, ): unknown | undefined => { let best: | { cls: unknown; specificity: number; code?: number; message: string } @@ -690,7 +725,7 @@ export const matchTypedError = ( if (!matchers) continue; for (const m of matchers) { for (const e of errors) { - if (!matchesExpression(m, e.code, status, e.message)) continue; + if (!matchesExpression(m, e.code, status, e.message, headers)) continue; const specificity = matcherSpecificity(m); if (!best || specificity > best.specificity) { best = { cls, specificity, code: e.code, message: e.message }; diff --git a/packages/core/src/protocol-rest.ts b/packages/core/src/protocol-rest.ts index ead8fa668..c4a4f2492 100644 --- a/packages/core/src/protocol-rest.ts +++ b/packages/core/src/protocol-rest.ts @@ -185,8 +185,17 @@ export interface RestProtocolOptions { * `OpContext` annotations. */ readonly credentials: Effect.Effect; - /** API base URL from the resolved credentials. */ - readonly baseUrl: (credentials: C) => string; + /** + * API base URL from the resolved credentials. The second argument is the + * operation's config (see {@link API.ProtocolOperationConfig}) so a + * provider can resolve per-operation endpoints (e.g. a data-plane op + * carrying an `endpointHostPrefix`). The returned string may contain + * `{name}` placeholders filled by input members marked `HostLabel()`. + */ + readonly baseUrl: ( + credentials: C, + config?: API.ProtocolOperationConfig, + ) => string; /** Auth (and any fixed) headers from the resolved credentials. */ readonly headers: (credentials: C) => Record; /** @@ -206,6 +215,18 @@ export interface RestProtocolOptions { readonly unknownError: (info: RestErrorInfo) => unknown; /** Transform the parsed 2xx JSON before decoding (e.g. stripNulls). */ readonly transformResponse?: (body: unknown) => unknown; + /** + * Intercept SUCCESS (< 400) decoding before the body is consumed as text — + * for responses that aren't JSON at all: raw binary bodies, multipart/mixed + * batches, header-projected outputs. Return an Effect producing the final + * decoded value to own the response, or `undefined` to fall through to the + * default text/JSON path. Error statuses never reach this hook. + */ + readonly decodeSuccess?: (ctx: { + readonly response: HttpClientResponse.HttpClientResponse; + readonly outputAst: AST.AST; + readonly config?: API.ProtocolOperationConfig; + }) => Effect.Effect | undefined; /** Passed through to `buildRequest` (member-header transforms). */ readonly mapMemberHeader?: (name: string, value: string) => string; /** Passed through to `buildRequest` (wire names for unmodeled input keys). */ @@ -251,16 +272,18 @@ export const makeRestProtocol = ( const encode = ({ input, inputAst, + config, }: { readonly input: unknown; readonly inputAst: AST.AST; + readonly config?: API.ProtocolOperationConfig; }) => Effect.gen(function* () { const creds = yield* options.credentials as Effect.Effect; return buildRequest({ input: unwrapRedactedDeep(input), inputAst, - baseUrl: options.baseUrl(creds), + baseUrl: options.baseUrl(creds, config), headers: options.headers(creds), mapMemberHeader: options.mapMemberHeader, unknownKeyToWire: options.unknownKeyToWire, @@ -271,12 +294,21 @@ export const makeRestProtocol = ( response, outputAst, errors: errorClasses, + config, }: { readonly response: HttpClientResponse.HttpClientResponse; readonly outputAst: AST.AST; readonly errors: ReadonlyArray; + readonly config?: API.ProtocolOperationConfig; }) => Effect.gen(function* () { + // Non-JSON success bodies (binary, multipart, header-projected + // outputs): the provider's hook owns them wholesale, BEFORE the body + // is consumed as text. + if (response.status < 400 && options.decodeSuccess !== undefined) { + const owned = options.decodeSuccess({ response, outputAst, config }); + if (owned !== undefined) return yield* owned; + } // Read as text and parse tolerantly — error pages are often non-JSON. const text = (yield* response.text.pipe(Effect.orDie)) ?? ""; if (process.env.DISTILLED_DEBUG_HTTP) { @@ -303,12 +335,17 @@ export const makeRestProtocol = ( (nonJson && text.trim() ? text.trim() : `HTTP ${status}`); // 1. Per-operation typed error (matcher metadata on the class). - const typed = matchTypedError(errorClasses, status, [ - { - code: typeof env.code === "number" ? env.code : undefined, - message, - }, - ]); + const typed = matchTypedError( + errorClasses, + status, + [ + { + code: typeof env.code === "number" ? env.code : undefined, + message, + }, + ], + headers, + ); if (typed !== undefined) return yield* fail(typed); // 2. Status-mapped class (retryAfter only stamps on retryable @@ -349,7 +386,13 @@ export const makeRestProtocol = ( // 2xx: the response body IS the payload (no envelope). Wire→TS key // mapping is schema-driven; `RawResponseRoot` responses are the body // verbatim (mapKeys handles arrays/scalars structurally either way). - let body: unknown = nonJson ? text : (json ?? {}); + // An EMPTY body decodes as `{}`; a JSON `null` body stays `null` (a + // bare-payload response's value can legitimately be null). + let body: unknown = nonJson + ? text + : text.trim().length === 0 + ? {} + : json; if (options.transformResponse) body = options.transformResponse(body); return wrapSensitive(outputAst, mapKeys(outputAst, body, "decode")); }); diff --git a/packages/core/src/retry.ts b/packages/core/src/retry.ts index 5a4c9938a..9c2da3e29 100644 --- a/packages/core/src/retry.ts +++ b/packages/core/src/retry.ts @@ -171,10 +171,42 @@ const serverHintMillis = ( error: unknown, capMs: number, ): number | undefined => { + const raw = rawServerHintMillis(error); + return raw === undefined ? undefined : Math.min(raw, capMs); +}; + +/** The server's `retryAfter` hint in milliseconds, uncapped. */ +const rawServerHintMillis = (error: unknown): number | undefined => { const hint = (error as { retryAfter?: unknown } | null | undefined) ?.retryAfter; if (!Duration.isDuration(hint)) return undefined; - return Math.min(Duration.toMillis(hint), capMs); + return Duration.toMillis(hint); +}; + +/** + * Whether the server's `Retry-After` hint exceeds our patience entirely. + * + * When a server says "retry in 24 hours" (e.g. Vercel's 5-per-day + * `POST /v1/teams` limit answers 429 with `retry-after: 86400`), retrying + * with delays capped at the hint cap provably cannot succeed — every capped + * retry lands inside the same window and burns the caller's timeout. The + * retry `while` predicates give up immediately in that case, surfacing the + * typed throttling error to the caller. + * + * Synchronous by necessity (`while` is a sync predicate), so the cap is + * resolved from `DISTILLED_SERVER_RETRY_HINT_CAP_MS` / the default only — + * the {@link ServerRetryHintCapMs} layer override affects delay computation, + * not the give-up threshold. + */ +const hintExceedsPatience = (error: unknown): boolean => { + const raw = rawServerHintMillis(error); + if (raw === undefined) return false; + const fromEnv = Number(process.env[ENV_SERVER_RETRY_HINT_CAP_MS] ?? ""); + const capMs = + Number.isFinite(fromEnv) && fromEnv >= 0 + ? Math.trunc(fromEnv) + : DEFAULT_SERVER_RETRY_HINT_CAP_MS; + return raw > capMs; }; /** @@ -222,7 +254,7 @@ const honorServerHint = ( * while a genuinely broken credential still fails within seconds. */ export const makeDefault: Factory = (lastError) => ({ - while: (error) => isTransientError(error), + while: (error) => isTransientError(error) && !hintExceedsPatience(error), // The 5s cap applies to the exponential backoff BEFORE the server hint is // considered, so a server-provided retryAfter longer than 5s is honored in // full (bounded only by the 60s hint cap inside honorServerHint). Capping @@ -248,7 +280,7 @@ export const makeDefault: Factory = (lastError) => ({ * present so callers using `.Retry.throttling` get correct backoff. */ export const throttlingFactory: Factory = (lastError) => ({ - while: (error) => isThrottling(error), + while: (error) => isThrottling(error) && !hintExceedsPatience(error), schedule: pipe( Schedule.exponential(1000, 2), capped(Duration.seconds(5)), @@ -265,7 +297,7 @@ export const throttlingFactory: Factory = (lastError) => ({ * cannot read `error.retryAfter`. */ export const throttlingOptions: Options = { - while: (error) => isThrottling(error), + while: (error) => isThrottling(error) && !hintExceedsPatience(error), schedule: pipe( Schedule.exponential(1000, 2), capped(Duration.seconds(5)), diff --git a/packages/core/src/trait.ts b/packages/core/src/trait.ts index f4d83bccc..ef37cb6ff 100644 --- a/packages/core/src/trait.ts +++ b/packages/core/src/trait.ts @@ -109,6 +109,21 @@ export const labelSymbol = Symbol.for("@distilled.cloud/core/http/label"); export const Label = (name?: string) => makeAnnotation(labelSymbol, name ?? true); +export const hostLabelSymbol = Symbol.for( + "@distilled.cloud/core/http/host-label", +); +/** + * Bind a member to a `{name}` placeholder in the ENDPOINT (base URL) + * template (mirrors `smithy.api#hostLabel`). Data-plane APIs commonly + * template their host per call — e.g. Vercel Queues' + * `https://{region}.vercel-queue.com` or a per-store content host. The value + * substitutes RAW (no percent-encoding — an endpoint template may take a + * whole origin as its label) and is never serialized into the path, query, + * headers, or body. + */ +export const HostLabel = (name?: string) => + makeAnnotation(hostLabelSymbol, name ?? true); + export const responseCodeSymbol = Symbol.for( "@distilled.cloud/core/http/response-code", ); @@ -204,9 +219,13 @@ export const errorMatchersSymbol = Symbol.for( /** * One wire-matching rule for a typed error class. A matcher matches a wire * failure when every present field matches: `code` equals the wire error's - * code, `status` equals the HTTP status, and `message` either equals the + * code, `status` equals the HTTP status, `message` either equals the * error message (string form) or satisfies `includes` (substring) / - * `matches` (regex). A matcher with no fields matches nothing. + * `matches` (regex), and `header` names a response header that must be + * PRESENT (some APIs discriminate failures by header — e.g. Vercel Edge + * Config's missing-item 404 carries `x-edge-config-digest` while a bare 404 + * means the config itself is gone). A matcher with no fields matches + * nothing. */ export interface ErrorMatcher { readonly code?: number; @@ -214,6 +233,7 @@ export interface ErrorMatcher { readonly message?: | string | { readonly includes?: string; readonly matches?: string }; + readonly header?: string; } /** diff --git a/packages/vercel/.generated-specs/access_groups.json b/packages/vercel/.generated-specs/access_groups.json index 1d59440be..3fbe84aa6 100644 --- a/packages/vercel/.generated-specs/access_groups.json +++ b/packages/vercel/.generated-specs/access_groups.json @@ -272,6 +272,9 @@ }, { "target": "com.vercel.access_groups#Forbidden" + }, + { + "target": "com.vercel.access_groups#NotFound" } ], "traits": { @@ -585,6 +588,9 @@ }, { "target": "com.vercel.access_groups#Forbidden" + }, + { + "target": "com.vercel.access_groups#NotFound" } ], "traits": { @@ -875,35 +881,35 @@ "smithy.api#input": {} } }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemMembersList": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemMembersList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemProjectsList": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemProjectsList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemEntitlementsList": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemEntitlementsList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamPermissionsList": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemTeamPermissionsList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamRolesList": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemTeamRolesList": { "type": "list", "member": { "target": "smithy.api#String" @@ -912,20 +918,20 @@ "smithy.api#documentation": "Roles that the team has in the access group." } }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItem": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItem": { "type": "structure", "members": { "members": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemMembersList" + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemMembersList" }, "projects": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemProjectsList" + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemProjectsList" }, "entitlements": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemEntitlementsList" + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemEntitlementsList" }, "teamPermissions": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamPermissionsList" + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemTeamPermissionsList" }, "isDsyncManaged": { "target": "smithy.api#Boolean", @@ -983,7 +989,7 @@ } }, "teamRoles": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamRolesList", + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItemTeamRolesList", "traits": { "smithy.api#documentation": "Roles that the team has in the access group." } @@ -991,14 +997,14 @@ }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsList": { + "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsList": { "type": "list", "member": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsItem" + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsItem" }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1Pagination": { + "com.vercel.access_groups#ListAccessGroupsResponsePagination": { "type": "structure", "members": { "count": { @@ -1017,47 +1023,22 @@ }, "traits": {} }, - "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1": { + "com.vercel.access_groups#ListAccessGroupsResponse": { "type": "structure", "members": { "accessGroups": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1AccessGroupsList", + "target": "com.vercel.access_groups#ListAccessGroupsResponseAccessGroupsList", "traits": { "smithy.api#required": {} } }, "pagination": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1Pagination", + "target": "com.vercel.access_groups#ListAccessGroupsResponsePagination", "traits": { "smithy.api#required": {} } } }, - "traits": {} - }, - "com.vercel.access_groups#ListAccessGroupsResponseBody": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#Document" - }, - "Case1": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBodyCase1" - } - }, - "traits": {} - }, - "com.vercel.access_groups#ListAccessGroupsResponse": { - "type": "structure", - "members": { - "body": { - "target": "com.vercel.access_groups#ListAccessGroupsResponseBody", - "traits": { - "com.distilled.openapi#rawResponse": {}, - "smithy.api#required": {} - } - } - }, "traits": { "smithy.api#output": {} } @@ -1814,6 +1795,9 @@ }, { "target": "com.vercel.access_groups#Forbidden" + }, + { + "target": "com.vercel.access_groups#NotFound" } ], "traits": { @@ -2043,6 +2027,9 @@ }, { "target": "com.vercel.access_groups#Forbidden" + }, + { + "target": "com.vercel.access_groups#NotFound" } ], "traits": { @@ -2080,6 +2067,19 @@ ] } }, + "com.vercel.access_groups#NotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { + "status": 404 + } + ] + } + }, "com.vercel.access_groups#AccessGroups": { "type": "service", "version": "0.0.1", diff --git a/packages/vercel/.generated-specs/ai_gateway.json b/packages/vercel/.generated-specs/ai_gateway.json index f5c70babb..5184f5287 100644 --- a/packages/vercel/.generated-specs/ai_gateway.json +++ b/packages/vercel/.generated-specs/ai_gateway.json @@ -197,6 +197,9 @@ }, { "target": "com.vercel.ai_gateway#Forbidden" + }, + { + "target": "com.vercel.ai_gateway#NotFound" } ], "traits": { @@ -407,28 +410,28 @@ ] } }, - "com.vercel.ai_gateway#Conflict": { + "com.vercel.ai_gateway#NotFound": { "type": "structure", "members": {}, "traits": { "smithy.api#error": "client", - "smithy.api#httpError": 409, + "smithy.api#httpError": 404, "com.distilled.openapi#errorMatchers": [ { - "status": 409 + "status": 404 } ] } }, - "com.vercel.ai_gateway#NotFound": { + "com.vercel.ai_gateway#Conflict": { "type": "structure", "members": {}, "traits": { "smithy.api#error": "client", - "smithy.api#httpError": 404, + "smithy.api#httpError": 409, "com.distilled.openapi#errorMatchers": [ { - "status": 404 + "status": 409 } ] } diff --git a/packages/vercel/.generated-specs/artifacts.json b/packages/vercel/.generated-specs/artifacts.json index 773e58d62..c67bbef80 100644 --- a/packages/vercel/.generated-specs/artifacts.json +++ b/packages/vercel/.generated-specs/artifacts.json @@ -469,6 +469,13 @@ "smithy.api#httpHeader": "x-Artifact-Dirty-Hash", "smithy.api#documentation": "A hash representing uncommitted changes in the working directory when this artifact was generated." } + }, + "body": { + "target": "smithy.api#Blob", + "traits": { + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } } }, "traits": { @@ -522,7 +529,8 @@ "smithy.api#http": { "method": "PUT", "uri": "/v8/artifacts/{hash}", - "code": 200 + "code": 200, + "bodyMediaType": "application/octet-stream" }, "smithy.api#documentation": "Upload a cache artifact\n\nUploads a cache artifact identified by the `hash` specified on the path. The cache artifact can then be downloaded with the provided `hash`." } diff --git a/packages/vercel/.generated-specs/bulk_redirects.json b/packages/vercel/.generated-specs/bulk_redirects.json index d37ceb645..e074aa5b6 100644 --- a/packages/vercel/.generated-specs/bulk_redirects.json +++ b/packages/vercel/.generated-specs/bulk_redirects.json @@ -154,17 +154,7 @@ "smithy.api#input": {} } }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase0Map": { - "type": "map", - "key": { - "target": "smithy.api#String" - }, - "value": { - "target": "smithy.api#Document" - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1Version": { + "com.vercel.bulk_redirects#GetRedirectsResponseVersion": { "type": "structure", "members": { "id": { @@ -226,7 +216,7 @@ }, "traits": {} }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1RedirectsItem": { + "com.vercel.bulk_redirects#GetRedirectsResponseRedirectsItem": { "type": "structure", "members": { "statusCode": { @@ -262,14 +252,14 @@ }, "traits": {} }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1RedirectsList": { + "com.vercel.bulk_redirects#GetRedirectsResponseRedirectsList": { "type": "list", "member": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1RedirectsItem" + "target": "com.vercel.bulk_redirects#GetRedirectsResponseRedirectsItem" }, "traits": {} }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1Pagination": { + "com.vercel.bulk_redirects#GetRedirectsResponsePagination": { "type": "structure", "members": { "page": { @@ -293,204 +283,23 @@ }, "traits": {} }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1": { + "com.vercel.bulk_redirects#GetRedirectsResponse": { "type": "structure", "members": { "version": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1Version", - "traits": { - "smithy.api#required": {} - } - }, - "redirects": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1RedirectsList", - "traits": { - "smithy.api#required": {} - } - }, - "pagination": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1Pagination", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2RedirectsItem": { - "type": "structure", - "members": { - "statusCode": { - "target": "smithy.api#Double" - }, - "permanent": { - "target": "smithy.api#Boolean" - }, - "sensitive": { - "target": "smithy.api#Boolean" - }, - "caseSensitive": { - "target": "smithy.api#Boolean" - }, - "query": { - "target": "smithy.api#Boolean" - }, - "preserveQueryParams": { - "target": "smithy.api#Boolean" - }, - "destination": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "source": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2RedirectsList": { - "type": "list", - "member": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2RedirectsItem" - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2Version": { - "type": "structure", - "members": { - "id": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The unique identifier for the version.", - "smithy.api#required": {} - } - }, - "key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version.", - "smithy.api#required": {} - } - }, - "lastModified": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#required": {} - } - }, - "createdBy": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "name": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Optional name for the version. If not provided, defaults to an ISO timestamp string." - } - }, - "isStaging": { - "target": "smithy.api#Boolean", + "target": "com.vercel.bulk_redirects#GetRedirectsResponseVersion", "traits": { - "smithy.api#documentation": "Whether this version has not been promoted to production yet and is not serving end users." - } - }, - "isLive": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this version is currently live in production." - } - }, - "redirectCount": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "The number of redirects in this version." - } - }, - "alias": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The staging link for previewing redirects in this version." - } - } - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2Pagination": { - "type": "structure", - "members": { - "page": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#required": {} - } - }, - "per_page": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#required": {} + "com.distilled.openapi#nullable": {} } }, - "numPages": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2": { - "type": "structure", - "members": { "redirects": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2RedirectsList", + "target": "com.vercel.bulk_redirects#GetRedirectsResponseRedirectsList", "traits": { "smithy.api#required": {} } }, - "version": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2Version" - }, "pagination": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2Pagination", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponseBody": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase0Map" - }, - "Case1": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase1" - }, - "Case2": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBodyCase2" - } - }, - "traits": {} - }, - "com.vercel.bulk_redirects#GetRedirectsResponse": { - "type": "structure", - "members": { - "body": { - "target": "com.vercel.bulk_redirects#GetRedirectsResponseBody", - "traits": { - "com.distilled.openapi#rawResponse": {}, - "smithy.api#required": {} - } + "target": "com.vercel.bulk_redirects#GetRedirectsResponsePagination" } }, "traits": { @@ -580,13 +389,6 @@ "com.vercel.bulk_redirects#StageRedirectsRequest": { "type": "structure", "members": { - "teamId": { - "target": "smithy.api#String", - "traits": { - "smithy.api#httpQuery": "teamId", - "smithy.api#documentation": "The Team identifier to perform the request on behalf of." - } - }, "slug": { "target": "smithy.api#String", "traits": { @@ -600,6 +402,12 @@ "smithy.api#required": {} } }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, "overwrite": { "target": "smithy.api#Boolean" }, @@ -711,6 +519,9 @@ }, { "target": "com.vercel.bulk_redirects#Forbidden" + }, + { + "target": "com.vercel.bulk_redirects#NotFound" } ], "traits": { @@ -1559,6 +1370,9 @@ }, { "target": "com.vercel.bulk_redirects#Forbidden" + }, + { + "target": "com.vercel.bulk_redirects#NotFound" } ], "traits": { diff --git a/packages/vercel/.generated-specs/certs.json b/packages/vercel/.generated-specs/certs.json index 9637f9206..fe0bcadad 100644 --- a/packages/vercel/.generated-specs/certs.json +++ b/packages/vercel/.generated-specs/certs.json @@ -443,6 +443,9 @@ }, { "target": "com.vercel.certs#NotFound" + }, + { + "target": "com.vercel.certs#DomainPretestFailed" } ], "traits": { @@ -628,6 +631,19 @@ ] } }, + "com.vercel.certs#DomainPretestFailed": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 449, + "com.distilled.openapi#errorMatchers": [ + { + "status": 449 + } + ] + } + }, "com.vercel.certs#Certs": { "type": "service", "version": "0.0.1", diff --git a/packages/vercel/.generated-specs/checks_v2.json b/packages/vercel/.generated-specs/checks_v2.json index 9a5356c82..73a57ed3b 100644 --- a/packages/vercel/.generated-specs/checks_v2.json +++ b/packages/vercel/.generated-specs/checks_v2.json @@ -1462,6 +1462,9 @@ }, { "target": "com.vercel.checks_v2#Forbidden" + }, + { + "target": "com.vercel.checks_v2#NotFound" } ], "traits": { diff --git a/packages/vercel/.generated-specs/deployments.json b/packages/vercel/.generated-specs/deployments.json index 8a87e1f21..9881b6fa6 100644 --- a/packages/vercel/.generated-specs/deployments.json +++ b/packages/vercel/.generated-specs/deployments.json @@ -1670,6 +1670,12 @@ "traits": { "smithy.api#enumValue": "READY" } + }, + "DELETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DELETED" + } } }, "traits": { @@ -1720,6 +1726,30 @@ }, "traits": {} }, + "com.vercel.deployments#GetDeploymentResponseBodyCase0ReadySubstate": { + "type": "enum", + "members": { + "PROMOTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "PROMOTED" + } + }, + "ROLLING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ROLLING" + } + }, + "STAGED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "STAGED" + } + } + }, + "traits": {} + }, "com.vercel.deployments#GetDeploymentResponseBodyCase0": { "type": "structure", "members": { @@ -1774,6 +1804,9 @@ "traits": { "com.distilled.openapi#nullable": {} } + }, + "readySubstate": { + "target": "com.vercel.deployments#GetDeploymentResponseBodyCase0ReadySubstate" } }, "traits": { @@ -3469,6 +3502,12 @@ "traits": { "smithy.api#enumValue": "READY" } + }, + "DELETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DELETED" + } } }, "traits": { @@ -13451,6 +13490,12 @@ "traits": { "smithy.api#enumValue": "READY" } + }, + "DELETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DELETED" + } } }, "traits": { @@ -39077,6 +39122,12 @@ "smithy.api#httpHeader": "x-Now-Size", "smithy.api#documentation": "The file size as an alternative to `Content-Length`" } + }, + "body": { + "target": "smithy.api#Blob", + "traits": { + "smithy.api#httpPayload": {} + } } }, "traits": { @@ -39152,7 +39203,8 @@ "smithy.api#http": { "method": "POST", "uri": "/v2/files", - "code": 200 + "code": 200, + "bodyMediaType": "application/octet-stream" }, "smithy.api#documentation": "Upload Deployment Files\n\nBefore you create a deployment you need to upload the required files for that deployment. To do it, you need to first upload each file to this endpoint. Once that's completed, you can create a new deployment with the uploaded files. The file content must be placed inside the body of the request. In the case of a successful response you'll receive a status code 200 with an empty body." } @@ -39382,13 +39434,28 @@ "smithy.api#input": {} } }, + "com.vercel.deployments#GetDeploymentFileContentsResponse": { + "type": "structure", + "members": { + "data": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The file contents, base64-encoded", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.vercel.deployments#GetDeploymentFileContents": { "type": "operation", "input": { "target": "com.vercel.deployments#GetDeploymentFileContentsRequest" }, "output": { - "target": "smithy.api#Unit" + "target": "com.vercel.deployments#GetDeploymentFileContentsResponse" }, "errors": [ { diff --git a/packages/vercel/.generated-specs/dns.json b/packages/vercel/.generated-specs/dns.json index c86c5a520..9a72062bd 100644 --- a/packages/vercel/.generated-specs/dns.json +++ b/packages/vercel/.generated-specs/dns.json @@ -566,6 +566,70 @@ "smithy.api#documentation": "The type of record, it could be one of the valid DNS records." } }, + "com.vercel.dns#CreateRecordRequestSrv": { + "type": "structure", + "members": { + "target": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SRV target hostname.", + "smithy.api#required": {} + } + }, + "weight": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The SRV weight.", + "smithy.api#required": {} + } + }, + "port": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The SRV port.", + "smithy.api#required": {} + } + }, + "priority": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The SRV priority.", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "The SRV record payload. Required for SRV records." + } + }, + "com.vercel.dns#CreateRecordRequestHttps": { + "type": "structure", + "members": { + "priority": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The HTTPS priority.", + "smithy.api#required": {} + } + }, + "target": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The HTTPS target hostname.", + "smithy.api#required": {} + } + }, + "params": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The HTTPS parameter string." + } + } + }, + "traits": { + "smithy.api#documentation": "The HTTPS record payload. Required for HTTPS records." + } + }, "com.vercel.dns#CreateRecordRequest": { "type": "structure", "members": { @@ -597,6 +661,48 @@ "smithy.api#documentation": "The type of record, it could be one of the valid DNS records.", "smithy.api#required": {} } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A subdomain name or an empty string for the root domain. Required for every record type except SRV and HTTPS, whose name is derived from srv/https." + } + }, + "value": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The record value (address, hostname, or text depending on the record type). Not used for SRV and HTTPS records, which use the srv/https objects instead." + } + }, + "ttl": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60." + } + }, + "mxPriority": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The MX priority value of the DNS record. Required for MX records." + } + }, + "srv": { + "target": "com.vercel.dns#CreateRecordRequestSrv", + "traits": { + "smithy.api#documentation": "The SRV record payload. Required for SRV records." + } + }, + "https": { + "target": "com.vercel.dns#CreateRecordRequestHttps", + "traits": { + "smithy.api#documentation": "The HTTPS record payload. Required for HTTPS records." + } + }, + "comment": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A comment to add context on what this DNS record is for" + } } }, "traits": { diff --git a/packages/vercel/.generated-specs/domains.json b/packages/vercel/.generated-specs/domains.json index b944f617d..5c18ff31d 100644 --- a/packages/vercel/.generated-specs/domains.json +++ b/packages/vercel/.generated-specs/domains.json @@ -1506,10 +1506,35 @@ "smithy.api#documentation": "The Team slug to perform the request on behalf of." } }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The domain name you want to add.", + "smithy.api#required": {} + } + }, "method": { "target": "smithy.api#String", "traits": { - "smithy.api#documentation": "The domain operation to perform. It can be either `add` or `move-in`." + "smithy.api#documentation": "The domain operation to perform. Omit (or `add`) to add the domain; `move-in` moves a domain from another Vercel account using `token`. Live behavior: sending `method: \"add\"` together with `name` fails the server-side oneOf validation — omit `method` entirely when adding." + } + }, + "cdnEnabled": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the domain has the Vercel Edge Network enabled or not." + } + }, + "zone": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether to create a DNS zone on Vercel. Set `true` if using Vercel nameservers (required before any DNS records can be created for the domain)." + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The move-in token from the Move Requested email. Only used with `method: \"move-in\"`." } } }, diff --git a/packages/vercel/.generated-specs/environment.json b/packages/vercel/.generated-specs/environment.json index e612ab707..613407cd9 100644 --- a/packages/vercel/.generated-specs/environment.json +++ b/packages/vercel/.generated-specs/environment.json @@ -972,6 +972,9 @@ }, { "target": "com.vercel.environment#Forbidden" + }, + { + "target": "com.vercel.environment#Conflict" } ], "traits": { @@ -1635,6 +1638,9 @@ }, { "target": "com.vercel.environment#Forbidden" + }, + { + "target": "com.vercel.environment#NotFound" } ], "traits": { @@ -1938,6 +1944,9 @@ }, { "target": "com.vercel.environment#Forbidden" + }, + { + "target": "com.vercel.environment#NotFound" } ], "traits": { @@ -2204,6 +2213,9 @@ }, { "target": "com.vercel.environment#Forbidden" + }, + { + "target": "com.vercel.environment#NotFound" } ], "traits": { @@ -2681,6 +2693,9 @@ }, { "target": "com.vercel.environment#Forbidden" + }, + { + "target": "com.vercel.environment#NotFound" } ], "traits": { @@ -2761,8 +2776,7 @@ "slug": { "target": "smithy.api#String", "traits": { - "smithy.api#httpQuery": "slug", - "smithy.api#documentation": "The Team slug to perform the request on behalf of." + "smithy.api#documentation": "The slug of the custom environment to create." } }, "description": { @@ -3557,8 +3571,7 @@ "slug": { "target": "smithy.api#String", "traits": { - "smithy.api#httpQuery": "slug", - "smithy.api#documentation": "The Team slug to perform the request on behalf of." + "smithy.api#documentation": "The slug of the custom environment." } }, "description": { @@ -4263,6 +4276,9 @@ }, { "target": "com.vercel.environment#Forbidden" + }, + { + "target": "com.vercel.environment#NotFound" } ], "traits": { @@ -4326,6 +4342,19 @@ ] } }, + "com.vercel.environment#Conflict": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 409, + "com.distilled.openapi#errorMatchers": [ + { + "status": 409 + } + ] + } + }, "com.vercel.environment#Environment": { "type": "service", "version": "0.0.1", diff --git a/packages/vercel/.generated-specs/feature_flags.json b/packages/vercel/.generated-specs/feature_flags.json index 3a5147be0..3c2f2c3a8 100644 --- a/packages/vercel/.generated-specs/feature_flags.json +++ b/packages/vercel/.generated-specs/feature_flags.json @@ -3367,8 +3367,8 @@ "slug": { "target": "smithy.api#String", "traits": { - "smithy.api#httpQuery": "slug", - "smithy.api#documentation": "The Team slug to perform the request on behalf of." + "smithy.api#documentation": "A unique (per project) key for the flag, composed of letters, numbers, dashes, and underscores", + "smithy.api#required": {} } }, "kind": { diff --git a/packages/vercel/.generated-specs/global_config.json b/packages/vercel/.generated-specs/global_config.json index 6e01f0116..b9b0e4e47 100644 --- a/packages/vercel/.generated-specs/global_config.json +++ b/packages/vercel/.generated-specs/global_config.json @@ -39,7 +39,7 @@ "smithy.api#input": {} } }, - "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase0Type": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase0Type": { "type": "enum", "members": { "FLAGS": { @@ -51,11 +51,11 @@ }, "traits": {} }, - "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase0": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase0": { "type": "structure", "members": { "type": { - "target": "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase0Type", + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase0Type", "traits": { "smithy.api#required": {} } @@ -69,7 +69,7 @@ }, "traits": {} }, - "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase1Type": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase1Type": { "type": "enum", "members": { "EXPERIMENTATION": { @@ -81,11 +81,11 @@ }, "traits": {} }, - "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase1": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase1": { "type": "structure", "members": { "type": { - "target": "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase1Type", + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase1Type", "traits": { "smithy.api#required": {} } @@ -99,19 +99,19 @@ }, "traits": {} }, - "com.vercel.global_config#GetEdgeConfigsResponsePurpose": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurpose": { "type": "union", "members": { "Case0": { - "target": "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase0" + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase0" }, "Case1": { - "target": "com.vercel.global_config#GetEdgeConfigsResponsePurposeCase1" + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurposeCase1" } }, "traits": {} }, - "com.vercel.global_config#GetEdgeConfigsResponseTransfer": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItemTransfer": { "type": "structure", "members": { "fromAccountId": { @@ -138,7 +138,7 @@ "smithy.api#documentation": "Keeps track of the current state of the Edge Config while it gets transferred." } }, - "com.vercel.global_config#GetEdgeConfigsResponse": { + "com.vercel.global_config#GetEdgeConfigsResponseBodyItem": { "type": "structure", "members": { "id": { @@ -185,7 +185,7 @@ } }, "purpose": { - "target": "com.vercel.global_config#GetEdgeConfigsResponsePurpose" + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItemPurpose" }, "deletedAt": { "target": "smithy.api#Double", @@ -194,7 +194,7 @@ } }, "transfer": { - "target": "com.vercel.global_config#GetEdgeConfigsResponseTransfer", + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItemTransfer", "traits": { "smithy.api#documentation": "Keeps track of the current state of the Edge Config while it gets transferred." } @@ -221,6 +221,28 @@ } } }, + "traits": { + "smithy.api#documentation": "List of all global configs." + } + }, + "com.vercel.global_config#GetEdgeConfigsResponseBodyList": { + "type": "list", + "member": { + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyItem" + }, + "traits": {} + }, + "com.vercel.global_config#GetEdgeConfigsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.vercel.global_config#GetEdgeConfigsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, "traits": { "smithy.api#output": {} } @@ -273,8 +295,7 @@ "slug": { "target": "smithy.api#String", "traits": { - "smithy.api#httpQuery": "slug", - "smithy.api#documentation": "The Team slug to perform the request on behalf of." + "smithy.api#required": {} } }, "items": { @@ -762,8 +783,7 @@ "slug": { "target": "smithy.api#String", "traits": { - "smithy.api#httpQuery": "slug", - "smithy.api#documentation": "The Team slug to perform the request on behalf of." + "smithy.api#required": {} } } }, @@ -1210,51 +1230,15 @@ "smithy.api#documentation": "Get Global Config items\n\nReturns all items of a Global Config." } }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase0": { - "type": "structure", - "members": { - "operation": { - "target": "smithy.api#Document", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase1Operation": { + "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemOperation": { "type": "enum", "members": { - "UPDATE": { + "CREATE": { "target": "smithy.api#Unit", "traits": { - "smithy.api#enumValue": "update" + "smithy.api#enumValue": "create" } }, - "UPSERT": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "upsert" - } - } - }, - "traits": {} - }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase1": { - "type": "structure", - "members": { - "operation": { - "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase1Operation", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase2Operation": { - "type": "enum", - "members": { "UPDATE": { "target": "smithy.api#Unit", "traits": { @@ -1266,48 +1250,30 @@ "traits": { "smithy.api#enumValue": "upsert" } - } - }, - "traits": {} - }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase2": { - "type": "structure", - "members": { - "operation": { - "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase2Operation", + }, + "DELETE": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#required": {} + "smithy.api#enumValue": "delete" } } }, "traits": {} }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase3": { + "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItem": { "type": "structure", "members": { "operation": { - "target": "smithy.api#Document", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase0" + "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemOperation" }, - "Case1": { - "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase1" + "key": { + "target": "smithy.api#String" }, - "Case2": { - "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase2" + "value": { + "target": "smithy.api#Document" }, - "Case3": { - "target": "com.vercel.global_config#PatchEdgeConfigItemsRequestItemsItemCase3" + "description": { + "target": "smithy.api#String" } }, "traits": {} @@ -1768,13 +1734,35 @@ "smithy.api#documentation": "The Global Config." } }, + "com.vercel.global_config#GetEdgeConfigTokensResponseBodyList": { + "type": "list", + "member": { + "target": "com.vercel.global_config#EdgeConfigToken" + }, + "traits": {} + }, + "com.vercel.global_config#GetEdgeConfigTokensResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.vercel.global_config#GetEdgeConfigTokensResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.vercel.global_config#GetEdgeConfigTokens": { "type": "operation", "input": { "target": "com.vercel.global_config#GetEdgeConfigTokensRequest" }, "output": { - "target": "com.vercel.global_config#EdgeConfigToken" + "target": "com.vercel.global_config#GetEdgeConfigTokensResponse" }, "errors": [ { diff --git a/packages/vercel/.generated-specs/microfrontends.json b/packages/vercel/.generated-specs/microfrontends.json index cb47f1012..423803c77 100644 --- a/packages/vercel/.generated-specs/microfrontends.json +++ b/packages/vercel/.generated-specs/microfrontends.json @@ -39,15 +39,137 @@ "smithy.api#input": {} } }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemGroup": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "fallbackEnvironment": { + "target": "smithy.api#String" + }, + "createdAt": { + "target": "smithy.api#Double" + }, + "updatedAt": { + "target": "smithy.api#Double" + } + }, + "traits": {} + }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontendsGroupIdsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends": { + "type": "structure", + "members": { + "enabled": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#required": {} + } + }, + "groupIds": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontendsGroupIdsList" + }, + "isDefaultApp": { + "target": "smithy.api#Boolean" + }, + "defaultRoute": { + "target": "smithy.api#String" + }, + "updatedAt": { + "target": "smithy.api#Double" + } + }, + "traits": {} + }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsItem": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "microfrontends": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends" + } + }, + "traits": {} + }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsList": { + "type": "list", + "member": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsItem" + }, + "traits": {} + }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItem": { + "type": "structure", + "members": { + "group": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemGroup", + "traits": { + "smithy.api#required": {} + } + }, + "projects": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItemProjectsList", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsList": { + "type": "list", + "member": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsItem" + }, + "traits": {} + }, "com.vercel.microfrontends#GetMicrofrontendsGroupsResponse": { "type": "structure", "members": { - "body": { - "target": "smithy.api#Document", + "groups": { + "target": "com.vercel.microfrontends#GetMicrofrontendsGroupsResponseGroupsList", "traits": { - "com.distilled.openapi#rawResponse": {}, "smithy.api#required": {} } + }, + "maxMicrofrontendsGroupsPerTeam": { + "target": "smithy.api#Double" + }, + "maxMicrofrontendsPerGroup": { + "target": "smithy.api#Double" } }, "traits": { diff --git a/packages/vercel/.generated-specs/project_members.json b/packages/vercel/.generated-specs/project_members.json index b25022eb2..756e5a0b4 100644 --- a/packages/vercel/.generated-specs/project_members.json +++ b/packages/vercel/.generated-specs/project_members.json @@ -75,7 +75,7 @@ "smithy.api#input": {} } }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItemRole": { + "com.vercel.project_members#GetProjectMembersResponseMembersItemRole": { "type": "enum", "members": { "ADMIN": { @@ -107,7 +107,7 @@ "smithy.api#documentation": "Role of this user in the project." } }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItemComputedProjectRole": { + "com.vercel.project_members#GetProjectMembersResponseMembersItemComputedProjectRole": { "type": "enum", "members": { "ADMIN": { @@ -139,7 +139,7 @@ "smithy.api#documentation": "Role of this user in the project." } }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItemTeamRole": { + "com.vercel.project_members#GetProjectMembersResponseMembersItemTeamRole": { "type": "enum", "members": { "BILLING": { @@ -195,7 +195,7 @@ "smithy.api#documentation": "The role of this user in the team." } }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItem": { + "com.vercel.project_members#GetProjectMembersResponseMembersItem": { "type": "structure", "members": { "avatar": { @@ -212,14 +212,14 @@ } }, "role": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItemRole", + "target": "com.vercel.project_members#GetProjectMembersResponseMembersItemRole", "traits": { "smithy.api#documentation": "Role of this user in the project.", "smithy.api#required": {} } }, "computedProjectRole": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItemComputedProjectRole", + "target": "com.vercel.project_members#GetProjectMembersResponseMembersItemComputedProjectRole", "traits": { "smithy.api#documentation": "Role of this user in the project.", "smithy.api#required": {} @@ -253,7 +253,7 @@ } }, "teamRole": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItemTeamRole", + "target": "com.vercel.project_members#GetProjectMembersResponseMembersItemTeamRole", "traits": { "smithy.api#documentation": "The role of this user in the team.", "smithy.api#required": {} @@ -262,34 +262,29 @@ }, "traits": {} }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersList": { + "com.vercel.project_members#GetProjectMembersResponseMembersList": { "type": "list", "member": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersItem" + "target": "com.vercel.project_members#GetProjectMembersResponseMembersItem" }, "traits": {} }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1Pagination": { + "com.vercel.project_members#GetProjectMembersResponsePagination": { "type": "structure", "members": { "hasNext": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#required": {} - } + "target": "smithy.api#Boolean" }, "count": { "target": "smithy.api#Double", "traits": { - "smithy.api#documentation": "Amount of items in the current page.", - "smithy.api#required": {} + "smithy.api#documentation": "Amount of items in the current page." } }, "next": { "target": "smithy.api#Double", "traits": { "smithy.api#documentation": "Timestamp that must be used to request the next page.", - "smithy.api#required": {}, "com.distilled.openapi#nullable": {} } }, @@ -297,52 +292,24 @@ "target": "smithy.api#Double", "traits": { "smithy.api#documentation": "Timestamp that must be used to request the previous page.", - "smithy.api#required": {}, "com.distilled.openapi#nullable": {} } } }, "traits": {} }, - "com.vercel.project_members#GetProjectMembersResponseBodyCase1": { + "com.vercel.project_members#GetProjectMembersResponse": { "type": "structure", "members": { "members": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1MembersList", + "target": "com.vercel.project_members#GetProjectMembersResponseMembersList", "traits": { "smithy.api#required": {} } }, "pagination": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1Pagination", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": { - "smithy.api#documentation": "Paginated list of members for the project." - } - }, - "com.vercel.project_members#GetProjectMembersResponseBody": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#Document" - }, - "Case1": { - "target": "com.vercel.project_members#GetProjectMembersResponseBodyCase1" - } - }, - "traits": {} - }, - "com.vercel.project_members#GetProjectMembersResponse": { - "type": "structure", - "members": { - "body": { - "target": "com.vercel.project_members#GetProjectMembersResponseBody", + "target": "com.vercel.project_members#GetProjectMembersResponsePagination", "traits": { - "com.distilled.openapi#rawResponse": {}, "smithy.api#required": {} } } @@ -365,6 +332,9 @@ }, { "target": "com.vercel.project_members#Forbidden" + }, + { + "target": "com.vercel.project_members#NotFound" } ], "traits": { @@ -485,6 +455,9 @@ }, { "target": "com.vercel.project_members#Forbidden" + }, + { + "target": "com.vercel.project_members#NotFound" } ], "traits": { @@ -562,6 +535,9 @@ }, { "target": "com.vercel.project_members#Forbidden" + }, + { + "target": "com.vercel.project_members#NotFound" } ], "traits": { @@ -599,6 +575,19 @@ ] } }, + "com.vercel.project_members#NotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { + "status": 404 + } + ] + } + }, "com.vercel.project_members#ProjectMembers": { "type": "service", "version": "0.0.1", diff --git a/packages/vercel/.generated-specs/project_routes.json b/packages/vercel/.generated-specs/project_routes.json index 02883a21c..67c82d32e 100644 --- a/packages/vercel/.generated-specs/project_routes.json +++ b/packages/vercel/.generated-specs/project_routes.json @@ -124,7 +124,7 @@ "smithy.api#input": {} } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHeadersMap": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHeadersMap": { "type": "map", "key": { "target": "smithy.api#String" @@ -134,14 +134,14 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMethodsList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMethodsList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0Type": { "type": "enum", "members": { "HOST": { @@ -153,7 +153,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1Eq": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1Eq": { "type": "union", "members": { "Case0": { @@ -165,34 +165,34 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1IncList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1IncList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1NincList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1NincList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1": { "type": "structure", "members": { "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1Eq" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1Eq" }, "neq": { "target": "smithy.api#String" }, "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1IncList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1IncList" }, "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1NincList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1NincList" }, "pre": { "target": "smithy.api#String" @@ -218,29 +218,29 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Value": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0Value": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0Type", "traits": { "smithy.api#required": {} } }, "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Value", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0Value", "traits": { "smithy.api#required": {} } @@ -248,7 +248,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1Type": { "type": "enum", "members": { "COOKIE": { @@ -272,7 +272,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1Eq": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1Eq": { "type": "union", "members": { "Case0": { @@ -284,34 +284,34 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1IncList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1IncList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1NincList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1NincList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1": { "type": "structure", "members": { "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1Eq" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1Eq" }, "neq": { "target": "smithy.api#String" }, "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1IncList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1IncList" }, "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1NincList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1NincList" }, "pre": { "target": "smithy.api#String" @@ -337,23 +337,23 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Value": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1Value": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1Type", "traits": { "smithy.api#required": {} } @@ -365,31 +365,31 @@ } }, "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Value" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1Value" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItem": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItem": { "type": "union", "members": { "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase0" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItemCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasList": { "type": "list", "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasItem" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasItem" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0Type": { "type": "enum", "members": { "HOST": { @@ -401,7 +401,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1Eq": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1Eq": { "type": "union", "members": { "Case0": { @@ -413,34 +413,34 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1IncList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1IncList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1NincList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1NincList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1": { "type": "structure", "members": { "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1Eq" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1Eq" }, "neq": { "target": "smithy.api#String" }, "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1IncList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1IncList" }, "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1NincList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1NincList" }, "pre": { "target": "smithy.api#String" @@ -466,29 +466,29 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Value": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0Value": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0Type", "traits": { "smithy.api#required": {} } }, "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Value", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0Value", "traits": { "smithy.api#required": {} } @@ -496,7 +496,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1Type": { "type": "enum", "members": { "COOKIE": { @@ -520,7 +520,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1Eq": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1Eq": { "type": "union", "members": { "Case0": { @@ -532,34 +532,34 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1IncList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1IncList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1NincList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1NincList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1": { "type": "structure", "members": { "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1Eq" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1Eq" }, "neq": { "target": "smithy.api#String" }, "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1IncList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1IncList" }, "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1NincList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1NincList" }, "pre": { "target": "smithy.api#String" @@ -585,23 +585,23 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Value": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1Value": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1Type", "traits": { "smithy.api#required": {} } @@ -613,31 +613,31 @@ } }, "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Value" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1Value" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItem": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItem": { "type": "union", "members": { "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase0" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItemCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingList": { "type": "list", "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingItem" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingItem" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMitigateAction": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMitigateAction": { "type": "enum", "members": { "CHALLENGE": { @@ -655,11 +655,11 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMitigate": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMitigate": { "type": "structure", "members": { "action": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMitigateAction", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMitigateAction", "traits": { "smithy.api#required": {} } @@ -667,7 +667,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Type": { "type": "enum", "members": { "REQUEST_HEADERS": { @@ -691,7 +691,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Op": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Op": { "type": "enum", "members": { "APPEND": { @@ -715,7 +715,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1Eq": { "type": "union", "members": { "Case0": { @@ -727,34 +727,34 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1IncList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1NincList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1": { "type": "structure", "members": { "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1Eq" }, "neq": { "target": "smithy.api#String" }, "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1IncList" }, "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1NincList" }, "pre": { "target": "smithy.api#String" @@ -777,23 +777,23 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKey": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKey": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Target": { "type": "structure", "members": { "key": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKey", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKey", "traits": { "smithy.api#required": {} } @@ -801,63 +801,63 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0ArgsCase1List": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0ArgsCase1List": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Args": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Args": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0ArgsCase1List" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0ArgsCase1List" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0EnvList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0EnvList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Type", "traits": { "smithy.api#required": {} } }, "op": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Op", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Op", "traits": { "smithy.api#required": {} } }, "target": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Target", "traits": { "smithy.api#required": {} } }, "args": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Args" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0Args" }, "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0EnvList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0EnvList" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1Type": { "type": "enum", "members": { "REQUEST_PATH": { @@ -869,7 +869,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Op": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1Op": { "type": "enum", "members": { "SET": { @@ -881,24 +881,24 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1EnvList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1EnvList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1Type", "traits": { "smithy.api#required": {} } }, "op": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Op", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1Op", "traits": { "smithy.api#required": {} } @@ -910,38 +910,38 @@ } }, "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1EnvList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1EnvList" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItem": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItem": { "type": "union", "members": { "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase0" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItemCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsList": { "type": "list", "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsItem" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsItem" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteEnvList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteEnvList": { "type": "list", "member": { "target": "smithy.api#String" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteLocaleRedirectMap": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteLocaleRedirectMap": { "type": "map", "key": { "target": "smithy.api#String" @@ -951,11 +951,11 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteLocale": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteLocale": { "type": "structure", "members": { "redirect": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteLocaleRedirectMap" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteLocaleRedirectMap" }, "cookie": { "target": "smithy.api#String" @@ -963,7 +963,7 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1Type": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteDestinationCase1Type": { "type": "enum", "members": { "SERVICE": { @@ -977,11 +977,11 @@ "smithy.api#documentation": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteDestinationCase1": { "type": "structure", "members": { "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1Type", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteDestinationCase1Type", "traits": { "smithy.api#documentation": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." } @@ -1001,19 +1001,19 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteDestination": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteDestination": { "type": "union", "members": { "Case0": { "target": "smithy.api#String" }, "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteDestinationCase1" } }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMiddlewareRawSrcList": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMiddlewareRawSrcList": { "type": "list", "member": { "target": "smithy.api#String" @@ -1022,7 +1022,7 @@ "smithy.api#documentation": "The original middleware matchers." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRoute": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRoute": { "type": "structure", "members": { "src": { @@ -1035,10 +1035,10 @@ "target": "smithy.api#String" }, "headers": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHeadersMap" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHeadersMap" }, "methods": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMethodsList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMethodsList" }, "continue": { "target": "smithy.api#Boolean" @@ -1059,22 +1059,22 @@ "target": "smithy.api#Double" }, "has": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteHasList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteHasList" }, "missing": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMissingList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMissingList" }, "mitigate": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMitigate" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMitigate" }, "transforms": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteTransformsList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteTransformsList" }, "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteEnvList" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteEnvList" }, "locale": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteLocale" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteLocale" }, "source": { "target": "smithy.api#String", @@ -1083,7 +1083,7 @@ } }, "destination": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteDestination" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteDestination" }, "statusCode": { "target": "smithy.api#Double" @@ -1095,7 +1095,7 @@ } }, "middlewareRawSrc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteMiddlewareRawSrcList", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteMiddlewareRawSrcList", "traits": { "smithy.api#documentation": "The original middleware matchers." } @@ -1114,7 +1114,7 @@ "smithy.api#documentation": "The route definition from @vercel/routing-utils." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemSrcSyntax": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemSrcSyntax": { "type": "enum", "members": { "EQUALS": { @@ -1140,7 +1140,7 @@ "smithy.api#documentation": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteType": { + "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteType": { "type": "enum", "members": { "REDIRECT": { @@ -1172,7 +1172,7 @@ "smithy.api#documentation": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItem": { + "com.vercel.project_routes#GetRoutesResponseRoutesItem": { "type": "structure", "members": { "id": { @@ -1208,7 +1208,7 @@ } }, "route": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRoute", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRoute", "traits": { "smithy.api#documentation": "The route definition from @vercel/routing-utils.", "smithy.api#required": {} @@ -1227,13 +1227,13 @@ } }, "srcSyntax": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemSrcSyntax", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemSrcSyntax", "traits": { "smithy.api#documentation": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." } }, "routeType": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItemRouteType", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItemRouteType", "traits": { "smithy.api#documentation": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." } @@ -1243,14 +1243,14 @@ "smithy.api#documentation": "A routing rule with metadata for project-level routing." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesList": { + "com.vercel.project_routes#GetRoutesResponseRoutesList": { "type": "list", "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesItem" + "target": "com.vercel.project_routes#GetRoutesResponseRoutesItem" }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1Version": { + "com.vercel.project_routes#GetRoutesResponseVersion": { "type": "structure", "members": { "id": { @@ -1310,2423 +1310,7 @@ "smithy.api#documentation": "A version of routing rules stored in S3." } }, - "com.vercel.project_routes#GetRoutesResponseBodyCase1": { - "type": "structure", - "members": { - "routes": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1RoutesList", - "traits": { - "smithy.api#required": {} - } - }, - "version": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1Version", - "traits": { - "smithy.api#documentation": "A version of routing rules stored in S3.", - "smithy.api#required": {} - } - }, - "diffCount": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHeadersMap": { - "type": "map", - "key": { - "target": "smithy.api#String" - }, - "value": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMethodsList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Type": { - "type": "enum", - "members": { - "HOST": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "host" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Type", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Value", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Type": { - "type": "enum", - "members": { - "COOKIE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "cookie" - } - }, - "HEADER": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "header" - } - }, - "QUERY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "query" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Type", - "traits": { - "smithy.api#required": {} - } - }, - "key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Value" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Type": { - "type": "enum", - "members": { - "HOST": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "host" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Type", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Value", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Type": { - "type": "enum", - "members": { - "COOKIE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "cookie" - } - }, - "HEADER": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "header" - } - }, - "QUERY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "query" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Type", - "traits": { - "smithy.api#required": {} - } - }, - "key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Value" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMitigateAction": { - "type": "enum", - "members": { - "CHALLENGE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "challenge" - } - }, - "DENY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "deny" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMitigate": { - "type": "structure", - "members": { - "action": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMitigateAction", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Type": { - "type": "enum", - "members": { - "REQUEST_HEADERS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "request.headers" - } - }, - "REQUEST_QUERY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "request.query" - } - }, - "RESPONSE_HEADERS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "response.headers" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Op": { - "type": "enum", - "members": { - "APPEND": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "append" - } - }, - "DELETE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "delete" - } - }, - "SET": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "set" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKey": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target": { - "type": "structure", - "members": { - "key": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKey", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0ArgsCase1List": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Args": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0ArgsCase1List" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0EnvList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Type", - "traits": { - "smithy.api#required": {} - } - }, - "op": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Op", - "traits": { - "smithy.api#required": {} - } - }, - "target": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target", - "traits": { - "smithy.api#required": {} - } - }, - "args": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Args" - }, - "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0EnvList" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Type": { - "type": "enum", - "members": { - "REQUEST_PATH": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "request.path" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Op": { - "type": "enum", - "members": { - "SET": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "set" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1EnvList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Type", - "traits": { - "smithy.api#required": {} - } - }, - "op": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Op", - "traits": { - "smithy.api#required": {} - } - }, - "args": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1EnvList" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteEnvList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteLocaleRedirectMap": { - "type": "map", - "key": { - "target": "smithy.api#String" - }, - "value": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteLocale": { - "type": "structure", - "members": { - "redirect": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteLocaleRedirectMap" - }, - "cookie": { - "target": "smithy.api#String" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1Type": { - "type": "enum", - "members": { - "SERVICE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "service" - } - } - }, - "traits": { - "smithy.api#documentation": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1Type", - "traits": { - "smithy.api#documentation": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." - } - }, - "service": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "path": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Routing-only path used to select a route inside the target service." - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteDestination": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMiddlewareRawSrcList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": { - "smithy.api#documentation": "The original middleware matchers." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRoute": { - "type": "structure", - "members": { - "src": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "dest": { - "target": "smithy.api#String" - }, - "headers": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHeadersMap" - }, - "methods": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMethodsList" - }, - "continue": { - "target": "smithy.api#Boolean" - }, - "override": { - "target": "smithy.api#Boolean" - }, - "caseSensitive": { - "target": "smithy.api#Boolean" - }, - "check": { - "target": "smithy.api#Boolean" - }, - "important": { - "target": "smithy.api#Boolean" - }, - "status": { - "target": "smithy.api#Double" - }, - "has": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteHasList" - }, - "missing": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMissingList" - }, - "mitigate": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMitigate" - }, - "transforms": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteTransformsList" - }, - "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteEnvList" - }, - "locale": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteLocale" - }, - "source": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." - } - }, - "destination": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteDestination" - }, - "statusCode": { - "target": "smithy.api#Double" - }, - "middlewarePath": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." - } - }, - "middlewareRawSrc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteMiddlewareRawSrcList", - "traits": { - "smithy.api#documentation": "The original middleware matchers." - } - }, - "middleware": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "A middleware index in the `middleware` key under the build result" - } - }, - "respectOriginCacheControl": { - "target": "smithy.api#Boolean" - } - }, - "traits": { - "smithy.api#documentation": "The route definition from @vercel/routing-utils." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemSrcSyntax": { - "type": "enum", - "members": { - "EQUALS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "equals" - } - }, - "PATH_TO_REGEXP": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "path-to-regexp" - } - }, - "REGEX": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "regex" - } - } - }, - "traits": { - "smithy.api#documentation": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteType": { - "type": "enum", - "members": { - "REDIRECT": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "redirect" - } - }, - "REWRITE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "rewrite" - } - }, - "SET_STATUS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "set_status" - } - }, - "TRANSFORM": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "transform" - } - } - }, - "traits": { - "smithy.api#documentation": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItem": { - "type": "structure", - "members": { - "id": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Unique identifier for the routing rule.", - "smithy.api#required": {} - } - }, - "name": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Human-readable name for the routing rule.", - "smithy.api#required": {} - } - }, - "description": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Optional description of what the routing rule does." - } - }, - "enabled": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether the routing rule is enabled. Defaults to true." - } - }, - "staged": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." - } - }, - "route": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRoute", - "traits": { - "smithy.api#documentation": "The route definition from @vercel/routing-utils.", - "smithy.api#required": {} - } - }, - "rawSrc": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." - } - }, - "rawDest": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Original destination provided by user." - } - }, - "srcSyntax": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemSrcSyntax", - "traits": { - "smithy.api#documentation": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." - } - }, - "routeType": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItemRouteType", - "traits": { - "smithy.api#documentation": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." - } - } - }, - "traits": { - "smithy.api#documentation": "A routing rule with metadata for project-level routing." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2Version": { - "type": "structure", - "members": { - "id": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Unique identifier for the version.", - "smithy.api#required": {} - } - }, - "s3Key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The S3 key where the routing rules are stored.", - "smithy.api#required": {} - } - }, - "lastModified": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "Timestamp of when this version was last modified.", - "smithy.api#required": {} - } - }, - "createdBy": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The user who created this version.", - "smithy.api#required": {} - } - }, - "isStaging": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this version is staged and not yet promoted to production." - } - }, - "isLive": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this version is currently live in production." - } - }, - "ruleCount": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "The number of routing rules in this version." - } - }, - "alias": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The staging alias for previewing this version." - } - } - }, - "traits": { - "smithy.api#documentation": "A version of routing rules stored in S3." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase2": { - "type": "structure", - "members": { - "routes": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2RoutesList", - "traits": { - "smithy.api#required": {} - } - }, - "version": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2Version", - "traits": { - "smithy.api#documentation": "A version of routing rules stored in S3.", - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHeadersMap": { - "type": "map", - "key": { - "target": "smithy.api#String" - }, - "value": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMethodsList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Type": { - "type": "enum", - "members": { - "HOST": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "host" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Type", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Value", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Type": { - "type": "enum", - "members": { - "COOKIE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "cookie" - } - }, - "HEADER": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "header" - } - }, - "QUERY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "query" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Type", - "traits": { - "smithy.api#required": {} - } - }, - "key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Value" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Type": { - "type": "enum", - "members": { - "HOST": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "host" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Type", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Value", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Type": { - "type": "enum", - "members": { - "COOKIE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "cookie" - } - }, - "HEADER": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "header" - } - }, - "QUERY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "query" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "re": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Value": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Type", - "traits": { - "smithy.api#required": {} - } - }, - "key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "value": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Value" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMitigateAction": { - "type": "enum", - "members": { - "CHALLENGE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "challenge" - } - }, - "DENY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "deny" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMitigate": { - "type": "structure", - "members": { - "action": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMitigateAction", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Type": { - "type": "enum", - "members": { - "REQUEST_HEADERS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "request.headers" - } - }, - "REQUEST_QUERY": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "request.query" - } - }, - "RESPONSE_HEADERS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "response.headers" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Op": { - "type": "enum", - "members": { - "APPEND": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "append" - } - }, - "DELETE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "delete" - } - }, - "SET": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "set" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1": { - "type": "structure", - "members": { - "eq": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq" - }, - "neq": { - "target": "smithy.api#String" - }, - "inc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList" - }, - "ninc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList" - }, - "pre": { - "target": "smithy.api#String" - }, - "suf": { - "target": "smithy.api#String" - }, - "gt": { - "target": "smithy.api#Double" - }, - "gte": { - "target": "smithy.api#Double" - }, - "lt": { - "target": "smithy.api#Double" - }, - "lte": { - "target": "smithy.api#Double" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKey": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target": { - "type": "structure", - "members": { - "key": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKey", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0ArgsCase1List": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Args": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0ArgsCase1List" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0EnvList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Type", - "traits": { - "smithy.api#required": {} - } - }, - "op": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Op", - "traits": { - "smithy.api#required": {} - } - }, - "target": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target", - "traits": { - "smithy.api#required": {} - } - }, - "args": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Args" - }, - "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0EnvList" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Type": { - "type": "enum", - "members": { - "REQUEST_PATH": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "request.path" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Op": { - "type": "enum", - "members": { - "SET": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "set" - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1EnvList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Type", - "traits": { - "smithy.api#required": {} - } - }, - "op": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Op", - "traits": { - "smithy.api#required": {} - } - }, - "args": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1EnvList" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItem": { - "type": "union", - "members": { - "Case0": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteEnvList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteLocaleRedirectMap": { - "type": "map", - "key": { - "target": "smithy.api#String" - }, - "value": { - "target": "smithy.api#String" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteLocale": { - "type": "structure", - "members": { - "redirect": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteLocaleRedirectMap" - }, - "cookie": { - "target": "smithy.api#String" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1Type": { - "type": "enum", - "members": { - "SERVICE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "service" - } - } - }, - "traits": { - "smithy.api#documentation": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1": { - "type": "structure", - "members": { - "type": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1Type", - "traits": { - "smithy.api#documentation": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." - } - }, - "service": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "path": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Routing-only path used to select a route inside the target service." - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteDestination": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#String" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMiddlewareRawSrcList": { - "type": "list", - "member": { - "target": "smithy.api#String" - }, - "traits": { - "smithy.api#documentation": "The original middleware matchers." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRoute": { - "type": "structure", - "members": { - "src": { - "target": "smithy.api#String", - "traits": { - "smithy.api#required": {} - } - }, - "dest": { - "target": "smithy.api#String" - }, - "headers": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHeadersMap" - }, - "methods": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMethodsList" - }, - "continue": { - "target": "smithy.api#Boolean" - }, - "override": { - "target": "smithy.api#Boolean" - }, - "caseSensitive": { - "target": "smithy.api#Boolean" - }, - "check": { - "target": "smithy.api#Boolean" - }, - "important": { - "target": "smithy.api#Boolean" - }, - "status": { - "target": "smithy.api#Double" - }, - "has": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteHasList" - }, - "missing": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMissingList" - }, - "mitigate": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMitigate" - }, - "transforms": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteTransformsList" - }, - "env": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteEnvList" - }, - "locale": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteLocale" - }, - "source": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." - } - }, - "destination": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteDestination" - }, - "statusCode": { - "target": "smithy.api#Double" - }, - "middlewarePath": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." - } - }, - "middlewareRawSrc": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteMiddlewareRawSrcList", - "traits": { - "smithy.api#documentation": "The original middleware matchers." - } - }, - "middleware": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "A middleware index in the `middleware` key under the build result" - } - }, - "respectOriginCacheControl": { - "target": "smithy.api#Boolean" - } - }, - "traits": { - "smithy.api#documentation": "The route definition from @vercel/routing-utils." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemSrcSyntax": { - "type": "enum", - "members": { - "EQUALS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "equals" - } - }, - "PATH_TO_REGEXP": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "path-to-regexp" - } - }, - "REGEX": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "regex" - } - } - }, - "traits": { - "smithy.api#documentation": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteType": { - "type": "enum", - "members": { - "REDIRECT": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "redirect" - } - }, - "REWRITE": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "rewrite" - } - }, - "SET_STATUS": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "set_status" - } - }, - "TRANSFORM": { - "target": "smithy.api#Unit", - "traits": { - "smithy.api#enumValue": "transform" - } - } - }, - "traits": { - "smithy.api#documentation": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItem": { - "type": "structure", - "members": { - "id": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Unique identifier for the routing rule.", - "smithy.api#required": {} - } - }, - "name": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Human-readable name for the routing rule.", - "smithy.api#required": {} - } - }, - "description": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Optional description of what the routing rule does." - } - }, - "enabled": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether the routing rule is enabled. Defaults to true." - } - }, - "staged": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." - } - }, - "route": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRoute", - "traits": { - "smithy.api#documentation": "The route definition from @vercel/routing-utils.", - "smithy.api#required": {} - } - }, - "rawSrc": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." - } - }, - "rawDest": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Original destination provided by user." - } - }, - "srcSyntax": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemSrcSyntax", - "traits": { - "smithy.api#documentation": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." - } - }, - "routeType": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItemRouteType", - "traits": { - "smithy.api#documentation": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." - } - } - }, - "traits": { - "smithy.api#documentation": "A routing rule with metadata for project-level routing." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesList": { - "type": "list", - "member": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesItem" - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3Version": { - "type": "structure", - "members": { - "id": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "Unique identifier for the version.", - "smithy.api#required": {} - } - }, - "s3Key": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The S3 key where the routing rules are stored.", - "smithy.api#required": {} - } - }, - "lastModified": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "Timestamp of when this version was last modified.", - "smithy.api#required": {} - } - }, - "createdBy": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The user who created this version.", - "smithy.api#required": {} - } - }, - "isStaging": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this version is staged and not yet promoted to production." - } - }, - "isLive": { - "target": "smithy.api#Boolean", - "traits": { - "smithy.api#documentation": "Whether this version is currently live in production." - } - }, - "ruleCount": { - "target": "smithy.api#Double", - "traits": { - "smithy.api#documentation": "The number of routing rules in this version." - } - }, - "alias": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The staging alias for previewing this version." - } - } - }, - "traits": { - "smithy.api#documentation": "A version of routing rules stored in S3." - } - }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3Limit": { + "com.vercel.project_routes#GetRoutesResponseLimit": { "type": "structure", "members": { "maxRoutes": { @@ -3744,57 +1328,29 @@ }, "traits": {} }, - "com.vercel.project_routes#GetRoutesResponseBodyCase3": { + "com.vercel.project_routes#GetRoutesResponse": { "type": "structure", "members": { "routes": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3RoutesList", + "target": "com.vercel.project_routes#GetRoutesResponseRoutesList", "traits": { "smithy.api#required": {} } }, "version": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3Version", + "target": "com.vercel.project_routes#GetRoutesResponseVersion", "traits": { "smithy.api#documentation": "A version of routing rules stored in S3.", - "smithy.api#required": {} + "com.distilled.openapi#nullable": {} } }, "limit": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3Limit", - "traits": { - "smithy.api#required": {} - } - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponseBody": { - "type": "union", - "members": { - "Case0": { - "target": "smithy.api#Document" - }, - "Case1": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase1" - }, - "Case2": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase2" + "target": "com.vercel.project_routes#GetRoutesResponseLimit" }, - "Case3": { - "target": "com.vercel.project_routes#GetRoutesResponseBodyCase3" - } - }, - "traits": {} - }, - "com.vercel.project_routes#GetRoutesResponse": { - "type": "structure", - "members": { - "body": { - "target": "com.vercel.project_routes#GetRoutesResponseBody", + "diffCount": { + "target": "smithy.api#Double", "traits": { - "com.distilled.openapi#rawResponse": {}, - "smithy.api#required": {} + "smithy.api#documentation": "Number of staged routes that differ from production. Present only when the diff query parameter is set." } } }, @@ -5808,6 +3364,9 @@ { "target": "com.vercel.project_routes#Forbidden" }, + { + "target": "com.vercel.project_routes#NotFound" + }, { "target": "com.vercel.project_routes#Conflict" } @@ -8155,6 +5714,9 @@ }, { "target": "com.vercel.project_routes#Forbidden" + }, + { + "target": "com.vercel.project_routes#NotFound" } ], "traits": { diff --git a/packages/vercel/.generated-specs/projects.json b/packages/vercel/.generated-specs/projects.json index f7f1dcc3a..9505fb91e 100644 --- a/packages/vercel/.generated-specs/projects.json +++ b/packages/vercel/.generated-specs/projects.json @@ -58631,6 +58631,9 @@ }, { "target": "com.vercel.projects#Forbidden" + }, + { + "target": "com.vercel.projects#NotFound" } ], "traits": { @@ -74218,6 +74221,9 @@ { "target": "com.vercel.projects#Forbidden" }, + { + "target": "com.vercel.projects#NotFound" + }, { "target": "com.vercel.projects#Conflict" } @@ -74255,6 +74261,12 @@ "smithy.api#httpQuery": "slug", "smithy.api#documentation": "The Team slug to perform the request on behalf of." } + }, + "body": { + "target": "smithy.api#Blob", + "traits": { + "smithy.api#httpPayload": {} + } } }, "traits": { @@ -87552,7 +87564,8 @@ "smithy.api#http": { "method": "POST", "uri": "/v1/projects/{idOrName}/avatar", - "code": 200 + "code": 200, + "bodyMediaType": "application/octet-stream" }, "smithy.api#documentation": "Upload a project avatar\n\nUpload an image as the avatar of the project identified by `idOrName`. The request body is the raw bytes of a JPG, PNG, or SVG image; the `Content-Type` header must declare which. SVG payloads are sanitized and optimized server-side before storage. The final SHA-1 of the stored bytes becomes the project's `avatar` value. The actual upload pipeline (validation, sanitization, S3 write, conditional `updateProject`, and event emission) lives in the shared `@api/project-avatar-upload` helper so it can be reused by background workers." } @@ -88157,6 +88170,9 @@ }, { "target": "com.vercel.projects#Forbidden" + }, + { + "target": "com.vercel.projects#NotFound" } ], "traits": { @@ -92251,6 +92267,9 @@ }, { "target": "com.vercel.projects#Forbidden" + }, + { + "target": "com.vercel.projects#NotFound" } ], "traits": { @@ -92262,10 +92281,262 @@ "smithy.api#documentation": "Retrieve the environment variables of a project by id or name\n\nRetrieve the environment variables for a given project by passing either the project `id` or `name` in the URL." } }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase0Type": { + "type": "enum", + "members": { + "SYSTEM": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "system" + } + }, + "ENCRYPTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "encrypted" + } + }, + "PLAIN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "plain" + } + }, + "SENSITIVE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sensitive" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of environment variable" + } + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase0TargetItem": { + "type": "enum", + "members": { + "PRODUCTION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "production" + } + }, + "PREVIEW": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "preview" + } + }, + "DEVELOPMENT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "development" + } + } + }, + "traits": {} + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase0TargetList": { + "type": "list", + "member": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase0TargetItem" + }, + "traits": { + "smithy.api#documentation": "The target environment of the environment variable" + } + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase0CustomEnvironmentIdsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The custom environment IDs associated with the environment variable" + } + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase0": { + "type": "structure", + "members": { + "key": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the environment variable", + "smithy.api#required": {} + } + }, + "value": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The value of the environment variable", + "smithy.api#required": {} + } + }, + "type": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase0Type", + "traits": { + "smithy.api#documentation": "The type of environment variable", + "smithy.api#required": {} + } + }, + "target": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase0TargetList", + "traits": { + "smithy.api#documentation": "The target environment of the environment variable" + } + }, + "gitBranch": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "If defined, the git branch of the environment variable (must have target=preview)", + "com.distilled.openapi#nullable": {} + } + }, + "comment": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A comment to add context on what this environment variable is for" + } + }, + "customEnvironmentIds": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase0CustomEnvironmentIdsList", + "traits": { + "smithy.api#documentation": "The custom environment IDs associated with the environment variable" + } + } + }, + "traits": {} + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemType": { + "type": "enum", + "members": { + "SYSTEM": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "system" + } + }, + "ENCRYPTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "encrypted" + } + }, + "PLAIN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "plain" + } + }, + "SENSITIVE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sensitive" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of environment variable" + } + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemTargetItem": { + "type": "enum", + "members": { + "PRODUCTION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "production" + } + }, + "PREVIEW": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "preview" + } + }, + "DEVELOPMENT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "development" + } + } + }, + "traits": {} + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemTargetList": { + "type": "list", + "member": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemTargetItem" + }, + "traits": { + "smithy.api#documentation": "The target environment of the environment variable" + } + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemCustomEnvironmentIdsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The custom environment IDs associated with the environment variable" + } + }, + "com.vercel.projects#CreateProjectEnvRequestBodyCase1Item": { + "type": "structure", + "members": { + "key": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the environment variable", + "smithy.api#required": {} + } + }, + "value": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The value of the environment variable", + "smithy.api#required": {} + } + }, + "type": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemType", + "traits": { + "smithy.api#documentation": "The type of environment variable", + "smithy.api#required": {} + } + }, + "target": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemTargetList", + "traits": { + "smithy.api#documentation": "The target environment of the environment variable" + } + }, + "gitBranch": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "If defined, the git branch of the environment variable (must have target=preview)", + "com.distilled.openapi#nullable": {} + } + }, + "comment": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A comment to add context on what this environment variable is for" + } + }, + "customEnvironmentIds": { + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase1ItemCustomEnvironmentIdsList", + "traits": { + "smithy.api#documentation": "The custom environment IDs associated with the environment variable" + } + } + }, + "traits": {} + }, "com.vercel.projects#CreateProjectEnvRequestBodyCase1List": { "type": "list", "member": { - "target": "smithy.api#Document" + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase1Item" }, "traits": {} }, @@ -92273,7 +92544,7 @@ "type": "union", "members": { "Case0": { - "target": "smithy.api#Document" + "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase0" }, "Case1": { "target": "com.vercel.projects#CreateProjectEnvRequestBodyCase1List" diff --git a/packages/vercel/.generated-specs/rolling_release.json b/packages/vercel/.generated-specs/rolling_release.json index d41fd00de..e96ca83d0 100644 --- a/packages/vercel/.generated-specs/rolling_release.json +++ b/packages/vercel/.generated-specs/rolling_release.json @@ -599,6 +599,66 @@ "smithy.api#documentation": "Get rolling release configuration\n\nGet the Rolling Releases configuration for a project. The project-level config is simply a template that will be used for any future rolling release, and not the configuration for any active rolling release." } }, + "com.vercel.rolling_release#UpdateRollingReleaseConfigRequestAdvancementType": { + "type": "enum", + "members": { + "AUTOMATIC": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "automatic" + } + }, + "MANUAL_APPROVAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "manual-approval" + } + } + }, + "traits": { + "smithy.api#documentation": "How the rollout advances between stages: `automatic` (per-stage duration) or `manual-approval`." + } + }, + "com.vercel.rolling_release#UpdateRollingReleaseConfigRequestStagesItem": { + "type": "structure", + "members": { + "targetPercentage": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "The percentage of traffic to serve to the canary deployment (0-100)", + "smithy.api#required": {} + } + }, + "requireApproval": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether or not this stage requires manual approval to proceed" + } + }, + "duration": { + "target": "smithy.api#Double", + "traits": { + "smithy.api#documentation": "Duration in minutes for automatic advancement to the next stage" + } + }, + "linearShift": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether to linearly shift traffic over the duration of this stage" + } + } + }, + "traits": {} + }, + "com.vercel.rolling_release#UpdateRollingReleaseConfigRequestStagesList": { + "type": "list", + "member": { + "target": "com.vercel.rolling_release#UpdateRollingReleaseConfigRequestStagesItem" + }, + "traits": { + "smithy.api#documentation": "An array of all the stages required during a deployment release. The final stage must have targetPercentage: 100." + } + }, "com.vercel.rolling_release#UpdateRollingReleaseConfigRequest": { "type": "structure", "members": { @@ -623,6 +683,31 @@ "smithy.api#httpQuery": "slug", "smithy.api#documentation": "The Team slug to perform the request on behalf of." } + }, + "enabled": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether rolling releases are enabled for the project. `false` clears the configuration (equivalent to DELETE).", + "smithy.api#required": {} + } + }, + "advancementType": { + "target": "com.vercel.rolling_release#UpdateRollingReleaseConfigRequestAdvancementType", + "traits": { + "smithy.api#documentation": "How the rollout advances between stages: `automatic` (per-stage duration) or `manual-approval`." + } + }, + "stages": { + "target": "com.vercel.rolling_release#UpdateRollingReleaseConfigRequestStagesList", + "traits": { + "smithy.api#documentation": "An array of all the stages required during a deployment release. The final stage must have targetPercentage: 100." + } + }, + "canaryResponseHeader": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether requests served by the canary deployment should return a header indicating a canary was served." + } } }, "traits": { diff --git a/packages/vercel/.generated-specs/storage.json b/packages/vercel/.generated-specs/storage.json index 40a4efa91..f4662a912 100644 --- a/packages/vercel/.generated-specs/storage.json +++ b/packages/vercel/.generated-specs/storage.json @@ -38,6 +38,20 @@ "traits": { "smithy.api#httpQuery": "include-guides" } + }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } } }, "traits": { @@ -791,6 +805,24 @@ }, "traits": {} }, + "com.vercel.storage#GetStorageStoresByIdResponseStoreAccess": { + "type": "enum", + "members": { + "PUBLIC": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "public" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + } + }, + "traits": {} + }, "com.vercel.storage#GetStorageStoresByIdResponseStore": { "type": "structure", "members": { @@ -818,6 +850,48 @@ "smithy.api#required": {}, "com.distilled.openapi#nullable": {} } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "createdAt": { + "target": "smithy.api#Double" + }, + "updatedAt": { + "target": "smithy.api#Double" + }, + "billingState": { + "target": "smithy.api#String" + }, + "region": { + "target": "smithy.api#String" + }, + "access": { + "target": "com.vercel.storage#GetStorageStoresByIdResponseStoreAccess" + }, + "size": { + "target": "smithy.api#Double" + }, + "count": { + "target": "smithy.api#Double" + }, + "isTokenExpired": { + "target": "smithy.api#Boolean" } }, "traits": {} @@ -1011,6 +1085,20 @@ "com.vercel.storage#CreateStorageStoresBlobRequest": { "type": "structure", "members": { + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } + }, "name": { "target": "smithy.api#String", "traits": { @@ -2008,6 +2096,33 @@ "traits": { "smithy.api#required": {} } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "createdAt": { + "target": "smithy.api#Double" + }, + "updatedAt": { + "target": "smithy.api#Double" + }, + "billingState": { + "target": "smithy.api#String" } }, "traits": {} @@ -2070,6 +2185,20 @@ "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } } }, "traits": { @@ -2121,83 +2250,583 @@ "smithy.api#documentation": "Delete a Blob store" } }, - "com.vercel.storage#BadRequest": { + "com.vercel.storage#GetStorageStoreConnectionsRequest": { "type": "structure", - "members": {}, - "traits": { - "smithy.api#error": "client", - "smithy.api#httpError": 400, - "com.distilled.openapi#errorMatchers": [ - { - "status": 400 + "members": { + "storeId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {} } - ] + }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } + } + }, + "traits": { + "smithy.api#input": {} } }, - "com.vercel.storage#Forbidden": { + "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItemProject": { "type": "structure", - "members": {}, - "traits": { - "smithy.api#error": "client", - "smithy.api#httpError": 403, - "com.distilled.openapi#errorMatchers": [ - { - "status": 403 + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} } - ] - } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": {} }, - "com.vercel.storage#NotFound": { - "type": "structure", - "members": {}, - "traits": { - "smithy.api#error": "client", - "smithy.api#httpError": 404, - "com.distilled.openapi#errorMatchers": [ - { - "status": 404 + "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsItem": { + "type": "enum", + "members": { + "DEVELOPMENT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "development" } - ] - } + }, + "PREVIEW": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "preview" + } + }, + "PRODUCTION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "production" + } + } + }, + "traits": {} }, - "com.vercel.storage#PaymentRequired": { + "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsList": { + "type": "list", + "member": { + "target": "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsItem" + }, + "traits": {} + }, + "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItem": { "type": "structure", - "members": {}, - "traits": { - "smithy.api#error": "client", - "smithy.api#httpError": 402, - "com.distilled.openapi#errorMatchers": [ - { - "status": 402 + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} } - ] - } + }, + "projectId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "project": { + "target": "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItemProject" + }, + "envVarPrefix": { + "target": "smithy.api#String", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "envVarEnvironments": { + "target": "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsList", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": {} }, - "com.vercel.storage#Conflict": { + "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsList": { + "type": "list", + "member": { + "target": "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsItem" + }, + "traits": {} + }, + "com.vercel.storage#GetStorageStoreConnectionsResponse": { "type": "structure", - "members": {}, - "traits": { - "smithy.api#error": "client", - "smithy.api#httpError": 409, - "com.distilled.openapi#errorMatchers": [ - { - "status": 409 + "members": { + "connections": { + "target": "com.vercel.storage#GetStorageStoreConnectionsResponseConnectionsList", + "traits": { + "smithy.api#required": {} } - ] + } + }, + "traits": { + "smithy.api#output": {} } }, - "com.vercel.storage#Storage": { - "type": "service", - "version": "0.0.1", - "operations": [ - { - "target": "com.vercel.storage#GetStorageStoresById" - }, - { + "com.vercel.storage#GetStorageStoreConnections": { + "type": "operation", + "input": { + "target": "com.vercel.storage#GetStorageStoreConnectionsRequest" + }, + "output": { + "target": "com.vercel.storage#GetStorageStoreConnectionsResponse" + }, + "errors": [ + { + "target": "com.vercel.storage#BadRequest" + }, + { + "target": "com.vercel.storage#Forbidden" + }, + { + "target": "com.vercel.storage#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/v1/storage/stores/{storeId}/connections", + "code": 200 + }, + "smithy.api#documentation": "List store connections\n\nList the projects connected to a storage store." + } + }, + "com.vercel.storage#CreateStorageStoreConnectionRequestEnvVarEnvironmentsItem": { + "type": "enum", + "members": { + "DEVELOPMENT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "development" + } + }, + "PREVIEW": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "preview" + } + }, + "PRODUCTION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "production" + } + } + }, + "traits": {} + }, + "com.vercel.storage#CreateStorageStoreConnectionRequestEnvVarEnvironmentsList": { + "type": "list", + "member": { + "target": "com.vercel.storage#CreateStorageStoreConnectionRequestEnvVarEnvironmentsItem" + }, + "traits": {} + }, + "com.vercel.storage#CreateStorageStoreConnectionRequestType": { + "type": "enum", + "members": { + "INTEGRATION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "integration" + } + } + }, + "traits": {} + }, + "com.vercel.storage#CreateStorageStoreConnectionRequest": { + "type": "structure", + "members": { + "storeId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } + }, + "projectId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "envVarEnvironments": { + "target": "com.vercel.storage#CreateStorageStoreConnectionRequestEnvVarEnvironmentsList", + "traits": { + "smithy.api#required": {} + } + }, + "type": { + "target": "com.vercel.storage#CreateStorageStoreConnectionRequestType", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.vercel.storage#CreateStorageStoreConnection": { + "type": "operation", + "input": { + "target": "com.vercel.storage#CreateStorageStoreConnectionRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.vercel.storage#BadRequest" + }, + { + "target": "com.vercel.storage#PaymentRequired" + }, + { + "target": "com.vercel.storage#Forbidden" + }, + { + "target": "com.vercel.storage#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/v1/storage/stores/{storeId}/connections", + "code": 200 + }, + "smithy.api#documentation": "Connect a store to a project\n\nConnect a storage store to a project. Injects the store's token env var (e.g. BLOB_READ_WRITE_TOKEN) into the project for the chosen environments." + } + }, + "com.vercel.storage#DeleteStorageStoreConnectionRequest": { + "type": "structure", + "members": { + "storeId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + }, + "connectionId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.vercel.storage#DeleteStorageStoreConnection": { + "type": "operation", + "input": { + "target": "com.vercel.storage#DeleteStorageStoreConnectionRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.vercel.storage#BadRequest" + }, + { + "target": "com.vercel.storage#Forbidden" + }, + { + "target": "com.vercel.storage#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/v1/storage/stores/{storeId}/connections/{connectionId}", + "code": 200 + }, + "smithy.api#documentation": "Disconnect a store from a project\n\nDisconnect a storage store from a project. Also removes the env var the connection injected into the project." + } + }, + "com.vercel.storage#GetStorageStoresRequest": { + "type": "structure", + "members": { + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.vercel.storage#GetStorageStoresResponseStoresItemAccess": { + "type": "enum", + "members": { + "PUBLIC": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "public" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + } + }, + "traits": {} + }, + "com.vercel.storage#GetStorageStoresResponseStoresItem": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "ownerId": { + "target": "smithy.api#String" + }, + "createdAt": { + "target": "smithy.api#Double" + }, + "updatedAt": { + "target": "smithy.api#Double" + }, + "type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "billingState": { + "target": "smithy.api#String" + }, + "status": { + "target": "smithy.api#String", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "region": { + "target": "smithy.api#String" + }, + "access": { + "target": "com.vercel.storage#GetStorageStoresResponseStoresItemAccess" + }, + "size": { + "target": "smithy.api#Double" + }, + "count": { + "target": "smithy.api#Double" + }, + "isTokenExpired": { + "target": "smithy.api#Boolean" + } + }, + "traits": {} + }, + "com.vercel.storage#GetStorageStoresResponseStoresList": { + "type": "list", + "member": { + "target": "com.vercel.storage#GetStorageStoresResponseStoresItem" + }, + "traits": {} + }, + "com.vercel.storage#GetStorageStoresResponse": { + "type": "structure", + "members": { + "stores": { + "target": "com.vercel.storage#GetStorageStoresResponseStoresList", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.vercel.storage#GetStorageStores": { + "type": "operation", + "input": { + "target": "com.vercel.storage#GetStorageStoresRequest" + }, + "output": { + "target": "com.vercel.storage#GetStorageStoresResponse" + }, + "errors": [ + { + "target": "com.vercel.storage#BadRequest" + }, + { + "target": "com.vercel.storage#Forbidden" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/storage/stores", + "code": 200 + }, + "smithy.api#documentation": "List stores\n\nList every storage store (all types: blob, edge-config, ...) on the account or team." + } + }, + "com.vercel.storage#BadRequest": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 400, + "com.distilled.openapi#errorMatchers": [ + { + "status": 400 + } + ] + } + }, + "com.vercel.storage#Forbidden": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 403, + "com.distilled.openapi#errorMatchers": [ + { + "status": 403 + } + ] + } + }, + "com.vercel.storage#NotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { + "status": 404 + } + ] + } + }, + "com.vercel.storage#PaymentRequired": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 402, + "com.distilled.openapi#errorMatchers": [ + { + "status": 402 + } + ] + } + }, + "com.vercel.storage#Conflict": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 409, + "com.distilled.openapi#errorMatchers": [ + { + "status": 409 + } + ] + } + }, + "com.vercel.storage#Storage": { + "type": "service", + "version": "0.0.1", + "operations": [ + { + "target": "com.vercel.storage#GetStorageStoresById" + }, + { "target": "com.vercel.storage#CreateStorageStoresBlob" }, { "target": "com.vercel.storage#DeleteStorageStoresBlobById" + }, + { + "target": "com.vercel.storage#GetStorageStoreConnections" + }, + { + "target": "com.vercel.storage#CreateStorageStoreConnection" + }, + { + "target": "com.vercel.storage#DeleteStorageStoreConnection" + }, + { + "target": "com.vercel.storage#GetStorageStores" } ], "traits": { diff --git a/packages/vercel/.generated-specs/teams.json b/packages/vercel/.generated-specs/teams.json index ac3edca8a..bfb83052a 100644 --- a/packages/vercel/.generated-specs/teams.json +++ b/packages/vercel/.generated-specs/teams.json @@ -997,7 +997,7 @@ "smithy.api#documentation": "List team members\n\nGet a paginated list of team members for the provided team." } }, - "com.vercel.teams#InviteUserToTeamRequestBodyItemRole": { + "com.vercel.teams#InviteUserToTeamRequestRole": { "type": "enum", "members": { "OWNER": { @@ -1053,7 +1053,7 @@ "smithy.api#documentation": "The role of the user to invite" } }, - "com.vercel.teams#InviteUserToTeamRequestBodyItemProjectsItemRole": { + "com.vercel.teams#InviteUserToTeamRequestProjectsItemRole": { "type": "enum", "members": { "ADMIN": { @@ -1085,7 +1085,7 @@ "smithy.api#documentation": "Sets the project roles for the invited user" } }, - "com.vercel.teams#InviteUserToTeamRequestBodyItemProjectsItem": { + "com.vercel.teams#InviteUserToTeamRequestProjectsItem": { "type": "structure", "members": { "projectId": { @@ -1096,7 +1096,7 @@ } }, "role": { - "target": "com.vercel.teams#InviteUserToTeamRequestBodyItemProjectsItemRole", + "target": "com.vercel.teams#InviteUserToTeamRequestProjectsItemRole", "traits": { "smithy.api#documentation": "Sets the project roles for the invited user", "smithy.api#required": {} @@ -1105,39 +1105,10 @@ }, "traits": {} }, - "com.vercel.teams#InviteUserToTeamRequestBodyItemProjectsList": { + "com.vercel.teams#InviteUserToTeamRequestProjectsList": { "type": "list", "member": { - "target": "com.vercel.teams#InviteUserToTeamRequestBodyItemProjectsItem" - }, - "traits": {} - }, - "com.vercel.teams#InviteUserToTeamRequestBodyItem": { - "type": "structure", - "members": { - "email": { - "target": "smithy.api#String", - "traits": { - "smithy.api#documentation": "The email address of the user to invite", - "smithy.api#required": {} - } - }, - "role": { - "target": "com.vercel.teams#InviteUserToTeamRequestBodyItemRole", - "traits": { - "smithy.api#documentation": "The role of the user to invite" - } - }, - "projects": { - "target": "com.vercel.teams#InviteUserToTeamRequestBodyItemProjectsList" - } - }, - "traits": {} - }, - "com.vercel.teams#InviteUserToTeamRequestBodyList": { - "type": "list", - "member": { - "target": "com.vercel.teams#InviteUserToTeamRequestBodyItem" + "target": "com.vercel.teams#InviteUserToTeamRequestProjectsItem" }, "traits": {} }, @@ -1159,11 +1130,21 @@ "smithy.api#documentation": "The Team slug to perform the request on behalf of." } }, - "body": { - "target": "com.vercel.teams#InviteUserToTeamRequestBodyList", + "email": { + "target": "smithy.api#String", "traits": { - "smithy.api#httpPayload": {} + "smithy.api#documentation": "The email address of the user to invite", + "smithy.api#required": {} } + }, + "role": { + "target": "com.vercel.teams#InviteUserToTeamRequestRole", + "traits": { + "smithy.api#documentation": "The role of the user to invite" + } + }, + "projects": { + "target": "com.vercel.teams#InviteUserToTeamRequestProjectsList" } }, "traits": { @@ -7817,6 +7798,9 @@ { "target": "com.vercel.teams#Forbidden" }, + { + "target": "com.vercel.teams#NotFound" + }, { "target": "com.vercel.teams#Conflict" } diff --git a/packages/vercel/.generated-specs/web_analytics.json b/packages/vercel/.generated-specs/web_analytics.json index e5ee1de35..be25f3668 100644 --- a/packages/vercel/.generated-specs/web_analytics.json +++ b/packages/vercel/.generated-specs/web_analytics.json @@ -89,6 +89,20 @@ "smithy.api#required": {} } }, + "teamId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "teamId", + "smithy.api#documentation": "The Team identifier to perform the request on behalf of." + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "slug", + "smithy.api#documentation": "The Team slug to perform the request on behalf of." + } + }, "value": { "target": "smithy.api#Boolean", "traits": { @@ -128,6 +142,9 @@ }, { "target": "com.vercel.web_analytics#Forbidden" + }, + { + "target": "com.vercel.web_analytics#NotFound" } ], "traits": { @@ -7949,6 +7966,19 @@ ] } }, + "com.vercel.web_analytics#NotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { + "status": 404 + } + ] + } + }, "com.vercel.web_analytics#WebAnalytics": { "type": "service", "version": "0.0.1", diff --git a/packages/vercel/.generated-specs/webhooks.json b/packages/vercel/.generated-specs/webhooks.json index 22b08d0d5..a7346ae1b 100644 --- a/packages/vercel/.generated-specs/webhooks.json +++ b/packages/vercel/.generated-specs/webhooks.json @@ -4413,6 +4413,9 @@ }, { "target": "com.vercel.webhooks#Forbidden" + }, + { + "target": "com.vercel.webhooks#NotFound" } ], "traits": { @@ -4467,6 +4470,9 @@ }, { "target": "com.vercel.webhooks#Forbidden" + }, + { + "target": "com.vercel.webhooks#NotFound" } ], "traits": { @@ -4504,6 +4510,19 @@ ] } }, + "com.vercel.webhooks#NotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { + "status": 404 + } + ] + } + }, "com.vercel.webhooks#Webhooks": { "type": "service", "version": "0.0.1", diff --git a/packages/vercel/manual-specs/blob_data.json b/packages/vercel/manual-specs/blob_data.json new file mode 100644 index 000000000..bf8a6b297 --- /dev/null +++ b/packages/vercel/manual-specs/blob_data.json @@ -0,0 +1,513 @@ +{ + "smithy": "2.0", + "metadata": { + "distilled.protocol": "BlobDataProtocol", + "note": "Hand-authored: the Vercel Blob DATA PLANE (https://blob.vercel-storage.com) is absent from the management OpenAPI document. Routes, headers, and the typed error taxonomy are transcribed from the live-verified wire protocol (processes/Vercel/PROBES.md, 'Blob data-plane + connect probes' / 'Blob capability probes', cross-checked against @vercel/blob@2.8.0). Auth is the store's RW token (vercel_blob_rw_...), a per-call sensitive input member. VERCEL_BLOB_API_URL overrides the endpoint (local emulation); content reads then move from the per-store host to {override}/{storeIdLower}.{access}/{pathname}.", + "suppressions": [ + { "id": "HttpUriConflict", "namespace": "*" }, + { "id": "HttpMethodSemantics", "namespace": "*" }, + { "id": "UnreferencedShape", "namespace": "*" } + ] + }, + "shapes": { + "com.vercel.blob_data#BlobUnauthorized": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "401 — the data-plane token was rejected.", + "smithy.api#error": "client", + "smithy.api#httpError": 401, + "com.distilled.openapi#errorMatchers": [{ "status": 401 }] + } + }, + "com.vercel.blob_data#BlobForbidden": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "403 — the token is not allowed to perform the operation (or an unauthenticated private read).", + "smithy.api#error": "client", + "smithy.api#httpError": 403, + "com.distilled.openapi#errorMatchers": [{ "status": 403 }] + } + }, + "com.vercel.blob_data#BlobNotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "404 `not_found` — the blob does not exist.", + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [{ "status": 404 }] + } + }, + "com.vercel.blob_data#BlobAlreadyExists": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "400 \"This blob already exists…\" — a conditional create (`x-allow-overwrite: 0`, or the header absent: the wire default REFUSES overwrites) hit an existing pathname.", + "smithy.api#error": "client", + "smithy.api#httpError": 400, + "com.distilled.openapi#errorMatchers": [ + { "status": 400, "message": { "includes": "already exists" } } + ] + } + }, + "com.vercel.blob_data#BlobPreconditionFailed": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "412 `precondition_failed` — the `x-if-match` etag no longer matches (CAS).", + "smithy.api#error": "client", + "smithy.api#httpError": 412, + "com.distilled.openapi#errorMatchers": [{ "status": 412 }] + } + }, + "com.vercel.blob_data#BlobBadRequest": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "Any other 400 from the data plane (e.g. access-mode mismatch on a put).", + "smithy.api#error": "client", + "smithy.api#httpError": 400, + "com.distilled.openapi#errorMatchers": [{ "status": 400 }] + } + }, + "com.vercel.blob_data#BlobAccess": { + "type": "enum", + "members": { + "PUBLIC": { "target": "smithy.api#Unit", "traits": { "smithy.api#enumValue": "public" } }, + "PRIVATE": { "target": "smithy.api#Unit", "traits": { "smithy.api#enumValue": "private" } } + }, + "traits": { + "smithy.api#documentation": "The store's access mode — must match the store (a private store rejects `public` and missing alike)." + } + }, + "com.vercel.blob_data#BlobAllowOverwrite": { + "type": "enum", + "members": { + "REFUSE": { "target": "smithy.api#Unit", "traits": { "smithy.api#enumValue": "0" } }, + "ALLOW": { "target": "smithy.api#Unit", "traits": { "smithy.api#enumValue": "1" } } + }, + "traits": { + "smithy.api#documentation": "`x-allow-overwrite` wire values: `1` overwrites, `0` is a conditional create (typed BlobAlreadyExists on an existing pathname). The wire DEFAULT with the header absent is to refuse overwrites — send it explicitly." + } + }, + "com.vercel.blob_data#PutBlobRequest": { + "type": "structure", + "members": { + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The store's RW token (`vercel_blob_rw_…`) — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "pathname": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Pathname of the blob within the store (query parameter, NOT the path).", + "smithy.api#httpQuery": "pathname", + "smithy.api#required": {} + } + }, + "access": { + "target": "com.vercel.blob_data#BlobAccess", + "traits": { + "smithy.api#documentation": "The store's access mode.", + "smithy.api#httpHeader": "x-vercel-blob-access", + "smithy.api#required": {} + } + }, + "contentType": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Content type stored and served with the blob.", + "smithy.api#httpHeader": "content-type" + } + }, + "ifMatch": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Compare-and-swap: only write if the blob's current quoted etag matches (412 BlobPreconditionFailed otherwise).", + "smithy.api#httpHeader": "x-if-match" + } + }, + "allowOverwrite": { + "target": "com.vercel.blob_data#BlobAllowOverwrite", + "traits": { + "smithy.api#documentation": "`1` to overwrite, `0` for a conditional create. The wire default (header absent) REFUSES overwrites.", + "smithy.api#httpHeader": "x-allow-overwrite" + } + }, + "body": { + "target": "smithy.api#Blob", + "traits": { + "smithy.api#documentation": "The blob content — sent verbatim as the request body.", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + } + } + }, + "com.vercel.blob_data#PutBlobResponse": { + "type": "structure", + "members": { + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Canonical blob URL (`https://{storeIdLower}.{access}.blob.vercel-storage.com/{pathname}`).", + "smithy.api#required": {} + } + }, + "downloadUrl": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The blob URL with `?download=1` (forces attachment disposition).", + "smithy.api#required": {} + } + }, + "pathname": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Pathname of the blob within the store.", + "smithy.api#required": {} + } + }, + "contentType": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Content type recorded at upload." } + }, + "contentDisposition": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Content disposition served with the blob." } + }, + "etag": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Quoted entity tag of the NEW content — the CAS handle for the next write.", + "smithy.api#required": {} + } + } + } + }, + "com.vercel.blob_data#PutBlob": { + "type": "operation", + "input": { "target": "com.vercel.blob_data#PutBlobRequest" }, + "output": { "target": "com.vercel.blob_data#PutBlobResponse" }, + "errors": [ + { "target": "com.vercel.blob_data#BlobAlreadyExists" }, + { "target": "com.vercel.blob_data#BlobPreconditionFailed" }, + { "target": "com.vercel.blob_data#BlobBadRequest" }, + { "target": "com.vercel.blob_data#BlobUnauthorized" }, + { "target": "com.vercel.blob_data#BlobForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "PUT", "uri": "/", "code": 200 }, + "smithy.api#documentation": "Upload a blob: `PUT {endpoint}/?pathname=…` with the content as the raw body. Every put returns the new content's etag." + } + }, + "com.vercel.blob_data#HeadBlobRequest": { + "type": "structure", + "members": { + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The store's RW token — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The blob's CANONICAL url (`https://{storeIdLower}.{access}.blob.vercel-storage.com/{pathname}`) — `?url=` is what makes this a head; `?pathname=` on GET is a prefix LIST.", + "smithy.api#httpQuery": "url", + "smithy.api#required": {} + } + } + } + }, + "com.vercel.blob_data#HeadBlobResponse": { + "type": "structure", + "members": { + "url": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Canonical blob URL.", "smithy.api#required": {} } + }, + "downloadUrl": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The blob URL with `?download=1`.", "smithy.api#required": {} } + }, + "pathname": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Pathname of the blob within the store.", "smithy.api#required": {} } + }, + "contentType": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Content type recorded at upload." } + }, + "contentDisposition": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Content disposition served with the blob." } + }, + "size": { + "target": "smithy.api#Long", + "traits": { "smithy.api#documentation": "Size in bytes.", "smithy.api#required": {} } + }, + "uploadedAt": { + "target": "smithy.api#Timestamp", + "traits": { "smithy.api#documentation": "Upload timestamp (ISO 8601).", "smithy.api#required": {} } + }, + "cacheControl": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Cache-control policy served with the blob." } + }, + "etag": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Quoted entity tag — pass to `ifMatch` for CAS.", + "smithy.api#required": {} + } + } + } + }, + "com.vercel.blob_data#HeadBlob": { + "type": "operation", + "input": { "target": "com.vercel.blob_data#HeadBlobRequest" }, + "output": { "target": "com.vercel.blob_data#HeadBlobResponse" }, + "errors": [ + { "target": "com.vercel.blob_data#BlobNotFound" }, + { "target": "com.vercel.blob_data#BlobBadRequest" }, + { "target": "com.vercel.blob_data#BlobUnauthorized" }, + { "target": "com.vercel.blob_data#BlobForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "GET", "uri": "/", "code": 200 }, + "smithy.api#documentation": "Blob metadata: `GET {endpoint}/?url=` → metadata JSON, 404 BlobNotFound when the blob does not exist." + } + }, + "com.vercel.blob_data#BlobListItem": { + "type": "structure", + "members": { + "url": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Canonical blob URL.", "smithy.api#required": {} } + }, + "downloadUrl": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The blob URL with `?download=1`.", "smithy.api#required": {} } + }, + "pathname": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Pathname of the blob within the store.", "smithy.api#required": {} } + }, + "size": { + "target": "smithy.api#Long", + "traits": { "smithy.api#documentation": "Size in bytes.", "smithy.api#required": {} } + }, + "uploadedAt": { + "target": "smithy.api#Timestamp", + "traits": { "smithy.api#documentation": "Upload timestamp (ISO 8601).", "smithy.api#required": {} } + }, + "etag": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Quoted entity tag — pass to `ifMatch` for CAS.", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "Metadata row returned by list — list rows carry no content type/disposition." + } + }, + "com.vercel.blob_data#BlobListItemList": { + "type": "list", + "member": { "target": "com.vercel.blob_data#BlobListItem" } + }, + "com.vercel.blob_data#ListBlobsRequest": { + "type": "structure", + "members": { + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The store's RW token — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "prefix": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Only list blobs whose pathname starts with this prefix.", + "smithy.api#httpQuery": "prefix" + } + }, + "limit": { + "target": "smithy.api#Integer", + "traits": { "smithy.api#documentation": "Page size.", "smithy.api#httpQuery": "limit" } + }, + "cursor": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Continuation cursor from a previous page.", + "smithy.api#httpQuery": "cursor" + } + } + } + }, + "com.vercel.blob_data#ListBlobsResponse": { + "type": "structure", + "members": { + "hasMore": { + "target": "smithy.api#Boolean", + "traits": { "smithy.api#documentation": "Whether another page exists.", "smithy.api#required": {} } + }, + "cursor": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Cursor for the next page (present when `hasMore`)." } + }, + "blobs": { + "target": "com.vercel.blob_data#BlobListItemList", + "traits": { "smithy.api#documentation": "One page of blobs.", "smithy.api#required": {} } + } + } + }, + "com.vercel.blob_data#ListBlobs": { + "type": "operation", + "input": { "target": "com.vercel.blob_data#ListBlobsRequest" }, + "output": { "target": "com.vercel.blob_data#ListBlobsResponse" }, + "errors": [ + { "target": "com.vercel.blob_data#BlobBadRequest" }, + { "target": "com.vercel.blob_data#BlobUnauthorized" }, + { "target": "com.vercel.blob_data#BlobForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "GET", "uri": "/", "code": 200 }, + "smithy.api#documentation": "One page of blobs: `GET {endpoint}/?prefix=&limit=&cursor=`. Callers advance `cursor` while `hasMore`." + } + }, + "com.vercel.blob_data#UrlList": { + "type": "list", + "member": { "target": "smithy.api#String" } + }, + "com.vercel.blob_data#DeleteBlobsRequest": { + "type": "structure", + "members": { + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The store's RW token — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "urls": { + "target": "com.vercel.blob_data#UrlList", + "traits": { + "smithy.api#documentation": "CANONICAL blob urls to delete (idempotent — missing blobs are not an error).", + "smithy.api#required": {} + } + } + } + }, + "com.vercel.blob_data#DeleteBlobsResponse": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "The wire answers `200 null`; there is no payload." + } + }, + "com.vercel.blob_data#DeleteBlobs": { + "type": "operation", + "input": { "target": "com.vercel.blob_data#DeleteBlobsRequest" }, + "output": { "target": "com.vercel.blob_data#DeleteBlobsResponse" }, + "errors": [ + { "target": "com.vercel.blob_data#BlobBadRequest" }, + { "target": "com.vercel.blob_data#BlobUnauthorized" }, + { "target": "com.vercel.blob_data#BlobForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "POST", "uri": "/delete", "code": 200 }, + "smithy.api#documentation": "Idempotent batch delete by canonical URL: `POST {endpoint}/delete` `{urls: […]}`." + } + }, + "com.vercel.blob_data#GetBlobContentRequest": { + "type": "structure", + "members": { + "store": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The store's content-host handle: `{bareStoreIdLower}.{access}` (store id minus `store_`, lowercased, dot, access mode). Fills the `{store}` endpoint label — live: `https://{store}.blob.vercel-storage.com`; under a VERCEL_BLOB_API_URL override: `{override}/{store}`.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The store's RW token — required for private stores, harmless for public ones.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "pathname": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Pathname of the blob within the store (may contain `/` — encoded per segment).", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + } + }, + "com.vercel.blob_data#GetBlobContentResponse": { + "type": "structure", + "members": { + "body": { + "target": "smithy.api#Blob", + "traits": { + "smithy.api#documentation": "The blob's content, buffered.", + "com.vercel.protocols#binaryResponseBody": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Content type served with the blob.", + "smithy.api#httpHeader": "content-type" + } + }, + "etag": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Quoted entity tag served with the content.", + "smithy.api#httpHeader": "etag" + } + } + } + }, + "com.vercel.blob_data#GetBlobContent": { + "type": "operation", + "input": { "target": "com.vercel.blob_data#GetBlobContentRequest" }, + "output": { "target": "com.vercel.blob_data#GetBlobContentResponse" }, + "errors": [ + { "target": "com.vercel.blob_data#BlobNotFound" }, + { "target": "com.vercel.blob_data#BlobUnauthorized" }, + { "target": "com.vercel.blob_data#BlobForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "GET", "uri": "/{pathname+}", "code": 200 }, + "smithy.api#endpoint": { "hostPrefix": "{store}." }, + "smithy.api#documentation": "Fetch a blob's content from its per-store host (`https://{store}.blob.vercel-storage.com/{pathname}`; under a VERCEL_BLOB_API_URL override: `{override}/{store}/{pathname}`)." + } + } + } +} diff --git a/packages/vercel/manual-specs/edge_config_data.json b/packages/vercel/manual-specs/edge_config_data.json new file mode 100644 index 000000000..1d4f0dbcf --- /dev/null +++ b/packages/vercel/manual-specs/edge_config_data.json @@ -0,0 +1,302 @@ +{ + "smithy": "2.0", + "metadata": { + "distilled.protocol": "EdgeConfigDataProtocol", + "note": "Hand-authored: the Vercel Edge Config READ plane (https://edge-config.vercel.com/{edgeConfigId}) is absent from the management OpenAPI document. Routes and semantics are transcribed from the probe-verified protocol contract (processes/Vercel/PROBES.md, 'EdgeConfig SDK vs localhost', cross-checked against @vercel/edge-config@1.5.1). Auth is the minted read token (the connection string's `token` query parameter) as a bearer. The endpoint is the per-call `origin` member — the connection string's origin IS the local-emulation override (http://localhost:). A missing ITEM is a 404 WITH an `x-edge-config-digest` response header (typed EdgeConfigItemNotFound); a bare 404 means the config itself (or the token) is invalid (typed EdgeConfigNotFound).", + "suppressions": [ + { "id": "HttpUriConflict", "namespace": "*" }, + { "id": "HttpMethodSemantics", "namespace": "*" }, + { "id": "UnreferencedShape", "namespace": "*" } + ] + }, + "shapes": { + "com.vercel.edge_config_data#EdgeConfigItemNotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "404 WITH the `x-edge-config-digest` response header — the config exists but the item does not. (`get` callers typically map this to `undefined`, `has` callers to `false`.)", + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { "status": 404, "header": "x-edge-config-digest" } + ] + } + }, + "com.vercel.edge_config_data#EdgeConfigNotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "Bare 404 (no `x-edge-config-digest` header) — the Edge Config itself does not exist or the token does not resolve to one.", + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [{ "status": 404 }] + } + }, + "com.vercel.edge_config_data#EdgeConfigUnauthorized": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "401 — the read token was rejected.", + "smithy.api#error": "client", + "smithy.api#httpError": 401, + "com.distilled.openapi#errorMatchers": [{ "status": 401 }] + } + }, + "com.vercel.edge_config_data#EdgeConfigItems": { + "type": "map", + "key": { "target": "smithy.api#String" }, + "value": { "target": "smithy.api#Document" }, + "traits": { + "smithy.api#documentation": "Items as a key → JSON value record." + } + }, + "com.vercel.edge_config_data#EdgeConfigKeyList": { + "type": "list", + "member": { "target": "smithy.api#String" } + }, + "com.vercel.edge_config_data#GetEdgeConfigItemRequest": { + "type": "structure", + "members": { + "origin": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin (local emulation hands out `http://localhost:`).", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The read token (the connection string's `token` parameter) — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "edgeConfigId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The Edge Config id (`ecfg_…`).", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "key": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The item key.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "version": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Protocol version — pass \"1\" (what @vercel/edge-config sends).", + "smithy.api#httpQuery": "version" + } + } + } + }, + "com.vercel.edge_config_data#GetEdgeConfigItemResponse": { + "type": "structure", + "members": { + "value": { + "target": "smithy.api#Document", + "traits": { + "smithy.api#documentation": "The item's JSON value (the whole response body — may be any JSON value, including null).", + "com.distilled.openapi#rawResponse": {} + } + } + } + }, + "com.vercel.edge_config_data#GetEdgeConfigItem": { + "type": "operation", + "input": { "target": "com.vercel.edge_config_data#GetEdgeConfigItemRequest" }, + "output": { "target": "com.vercel.edge_config_data#GetEdgeConfigItemResponse" }, + "errors": [ + { "target": "com.vercel.edge_config_data#EdgeConfigItemNotFound" }, + { "target": "com.vercel.edge_config_data#EdgeConfigNotFound" }, + { "target": "com.vercel.edge_config_data#EdgeConfigUnauthorized" } + ], + "traits": { + "smithy.api#http": { "method": "GET", "uri": "/{edgeConfigId}/item/{key}", "code": 200 }, + "smithy.api#documentation": "Read a single item: `GET {origin}/{edgeConfigId}/item/{key}?version=1`. A missing item is the typed EdgeConfigItemNotFound (map it to `undefined`)." + } + }, + "com.vercel.edge_config_data#GetEdgeConfigItemsRequest": { + "type": "structure", + "members": { + "origin": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The read token — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "edgeConfigId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The Edge Config id (`ecfg_…`).", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "keys": { + "target": "com.vercel.edge_config_data#EdgeConfigKeyList", + "traits": { + "smithy.api#documentation": "Optional key filter — each entry repeats as a `key=` query parameter; omit for all items.", + "smithy.api#httpQuery": "key" + } + }, + "version": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Protocol version — pass \"1\".", + "smithy.api#httpQuery": "version" + } + } + } + }, + "com.vercel.edge_config_data#GetEdgeConfigItemsResponse": { + "type": "structure", + "members": { + "items": { + "target": "com.vercel.edge_config_data#EdgeConfigItems", + "traits": { + "smithy.api#documentation": "All (or the filtered) items as a record (the whole response body).", + "com.distilled.openapi#rawResponse": {} + } + } + } + }, + "com.vercel.edge_config_data#GetEdgeConfigItems": { + "type": "operation", + "input": { "target": "com.vercel.edge_config_data#GetEdgeConfigItemsRequest" }, + "output": { "target": "com.vercel.edge_config_data#GetEdgeConfigItemsResponse" }, + "errors": [ + { "target": "com.vercel.edge_config_data#EdgeConfigNotFound" }, + { "target": "com.vercel.edge_config_data#EdgeConfigUnauthorized" } + ], + "traits": { + "smithy.api#http": { "method": "GET", "uri": "/{edgeConfigId}/items", "code": 200 }, + "smithy.api#documentation": "Read all items (or a key subset): `GET {origin}/{edgeConfigId}/items?version=1[&key=…]`." + } + }, + "com.vercel.edge_config_data#HasEdgeConfigItemRequest": { + "type": "structure", + "members": { + "origin": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The read token — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "edgeConfigId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The Edge Config id (`ecfg_…`).", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "key": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The item key.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "version": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Protocol version — pass \"1\".", + "smithy.api#httpQuery": "version" + } + } + } + }, + "com.vercel.edge_config_data#HasEdgeConfigItemResponse": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "A 200 means the item exists; a missing item is the typed EdgeConfigItemNotFound (map it to `false`)." + } + }, + "com.vercel.edge_config_data#HasEdgeConfigItem": { + "type": "operation", + "input": { "target": "com.vercel.edge_config_data#HasEdgeConfigItemRequest" }, + "output": { "target": "com.vercel.edge_config_data#HasEdgeConfigItemResponse" }, + "errors": [ + { "target": "com.vercel.edge_config_data#EdgeConfigItemNotFound" }, + { "target": "com.vercel.edge_config_data#EdgeConfigNotFound" }, + { "target": "com.vercel.edge_config_data#EdgeConfigUnauthorized" } + ], + "traits": { + "smithy.api#http": { "method": "HEAD", "uri": "/{edgeConfigId}/item/{key}", "code": 200 }, + "smithy.api#documentation": "Existence check: `HEAD {origin}/{edgeConfigId}/item/{key}?version=1` — 200 exists, typed EdgeConfigItemNotFound otherwise." + } + }, + "com.vercel.edge_config_data#GetEdgeConfigDigestRequest": { + "type": "structure", + "members": { + "origin": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The read token — sent as the bearer.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "edgeConfigId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The Edge Config id (`ecfg_…`).", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "version": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Protocol version — pass \"1\".", + "smithy.api#httpQuery": "version" + } + } + } + }, + "com.vercel.edge_config_data#GetEdgeConfigDigestResponse": { + "type": "structure", + "members": { + "digest": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The config's content digest (the whole response body, a JSON string) — changes whenever any item changes.", + "com.distilled.openapi#rawResponse": {} + } + } + } + }, + "com.vercel.edge_config_data#GetEdgeConfigDigest": { + "type": "operation", + "input": { "target": "com.vercel.edge_config_data#GetEdgeConfigDigestRequest" }, + "output": { "target": "com.vercel.edge_config_data#GetEdgeConfigDigestResponse" }, + "errors": [ + { "target": "com.vercel.edge_config_data#EdgeConfigNotFound" }, + { "target": "com.vercel.edge_config_data#EdgeConfigUnauthorized" } + ], + "traits": { + "smithy.api#http": { "method": "GET", "uri": "/{edgeConfigId}/digest", "code": 200 }, + "smithy.api#documentation": "The config's content digest: `GET {origin}/{edgeConfigId}/digest?version=1`." + } + } + } +} diff --git a/packages/vercel/manual-specs/queues_data.json b/packages/vercel/manual-specs/queues_data.json new file mode 100644 index 000000000..875428f4a --- /dev/null +++ b/packages/vercel/manual-specs/queues_data.json @@ -0,0 +1,527 @@ +{ + "smithy": "2.0", + "metadata": { + "distilled.protocol": "QueuesDataProtocol", + "note": "Hand-authored: the Vercel Queues DATA PLANE (https://{region}.vercel-queue.com/api/v3) is absent from the management OpenAPI document. Routes, Vqs-* headers, multipart/mixed receives, and the typed error taxonomy are transcribed from the documented protocol + @vercel/queue@0.4.0, live-verified in processes/Vercel/PROBES.md (probe 4 + 'Queue subscribe / push-delivery probes'). Auth is a per-call OIDC bearer (per project+ENVIRONMENT namespace — externally minted tokens are always development-scoped). VERCEL_QUEUE_BASE_URL overrides the host (local broker emulation); the /api/v3 path prefix survives the override.", + "suppressions": [ + { "id": "HttpUriConflict", "namespace": "*" }, + { "id": "HttpMethodSemantics", "namespace": "*" }, + { "id": "UnreferencedShape", "namespace": "*" } + ] + }, + "shapes": { + "com.vercel.queues_data#QueueBadRequest": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "400 — invalid parameters (bad visibility timeout, malformed request, …).", + "smithy.api#error": "client", + "smithy.api#httpError": 400, + "com.distilled.openapi#errorMatchers": [{ "status": 400 }] + } + }, + "com.vercel.queues_data#QueueUnauthorized": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "401 — the OIDC bearer token is missing, expired, or invalid.", + "smithy.api#error": "client", + "smithy.api#httpError": 401, + "com.distilled.openapi#errorMatchers": [{ "status": 401 }] + } + }, + "com.vercel.queues_data#QueueForbidden": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "403 — the token is valid but not allowed to access this topic.", + "smithy.api#error": "client", + "smithy.api#httpError": 403, + "com.distilled.openapi#errorMatchers": [{ "status": 403 }] + } + }, + "com.vercel.queues_data#DuplicateMessage": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "409 on send — the `Vqs-Idempotency-Key` was already used.", + "smithy.api#error": "client", + "smithy.api#httpError": 409, + "com.distilled.openapi#errorMatchers": [{ "status": 409 }] + } + }, + "com.vercel.queues_data#ConsumerDiscoveryFailed": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "502 on send — the platform could not discover a consumer for the topic.", + "smithy.api#error": "server", + "smithy.api#httpError": 502, + "com.distilled.openapi#errorMatchers": [{ "status": 502 }] + } + }, + "com.vercel.queues_data#ConsumerRegistryNotConfigured": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "503 on send — the project has no consumer registry configured (no deployment carries a queue trigger for this topic yet). Deliberately carries NO retryable category: it is a configuration gap, not a transient failure.", + "smithy.api#error": "server", + "com.distilled.openapi#errorMatchers": [{ "status": 503 }] + } + }, + "com.vercel.queues_data#MessageNotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "404 — no such message (or receipt handle) for this consumer group.", + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [{ "status": 404 }] + } + }, + "com.vercel.queues_data#MessageNotAvailable": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "409 — the message exists but is not in a receivable/ackable state for this consumer group (already leased, wrong receipt handle, or a duplicate whose `originalMessageId` — in the message body JSON — should be used instead).", + "smithy.api#error": "client", + "smithy.api#httpError": 409, + "com.distilled.openapi#errorMatchers": [{ "status": 409 }] + } + }, + "com.vercel.queues_data#MessageAlreadyProcessed": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#documentation": "410 — the message was already processed by this consumer group.", + "smithy.api#error": "client", + "smithy.api#httpError": 410, + "com.distilled.openapi#errorMatchers": [{ "status": 410 }] + } + }, + "com.vercel.queues_data#QueueMessage": { + "type": "structure", + "members": { + "messageId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Unique message id (`Vqs-Message-Id`).", "smithy.api#required": {} } + }, + "deliveryCount": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Delivery attempt count for this consumer group (`Vqs-Delivery-Count`).", + "smithy.api#required": {} + } + }, + "createdAt": { + "target": "smithy.api#Timestamp", + "traits": { + "smithy.api#documentation": "When the message was enqueued (`Vqs-Timestamp`, ISO 8601).", + "smithy.api#required": {} + } + }, + "expiresAt": { + "target": "smithy.api#Timestamp", + "traits": { "smithy.api#documentation": "When the message expires (`Vqs-Expires-At`), if reported." } + }, + "contentType": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Payload content type (`Content-Type` of the multipart part).", + "smithy.api#required": {} + } + }, + "receiptHandle": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Lease handle for this delivery (`Vqs-Receipt-Handle`) — pass to acknowledgeMessage/extendLease. Scoped to the consumer group and delivery.", + "smithy.api#required": {} + } + }, + "payload": { + "target": "smithy.api#Blob", + "traits": { "smithy.api#documentation": "The raw payload bytes of the part.", "smithy.api#required": {} } + } + }, + "traits": { + "smithy.api#documentation": "One received message: the `Vqs-*` part headers plus the raw payload bytes." + } + }, + "com.vercel.queues_data#QueueMessageList": { + "type": "list", + "member": { "target": "com.vercel.queues_data#QueueMessage" } + }, + "com.vercel.queues_data#SendMessageRequest": { + "type": "structure", + "members": { + "region": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Region host label (`https://{region}.vercel-queue.com`), e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "OIDC bearer token.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "topic": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Topic (queue) name.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "deploymentId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Deployment partition pin (`Vqs-Deployment-Id`). Load-bearing: visibility is partitioned by it — unpinned sends are invisible to pinned receivers and vice versa.", + "smithy.api#httpHeader": "Vqs-Deployment-Id" + } + }, + "contentType": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Payload content type — echoed back on delivery.", + "smithy.api#httpHeader": "content-type", + "smithy.api#required": {} + } + }, + "idempotencyKey": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Dedupe key (`Vqs-Idempotency-Key`) — a reuse fails with the typed DuplicateMessage.", + "smithy.api#httpHeader": "Vqs-Idempotency-Key" + } + }, + "retentionSeconds": { + "target": "smithy.api#Integer", + "traits": { "smithy.api#documentation": "Message retention (`Vqs-Retention-Seconds`).", "smithy.api#httpHeader": "Vqs-Retention-Seconds" } + }, + "delaySeconds": { + "target": "smithy.api#Integer", + "traits": { "smithy.api#documentation": "Delivery delay (`Vqs-Delay-Seconds`).", "smithy.api#httpHeader": "Vqs-Delay-Seconds" } + }, + "payload": { + "target": "smithy.api#Blob", + "traits": { + "smithy.api#documentation": "The message payload — sent verbatim as the request body.", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + } + } + }, + "com.vercel.queues_data#SendMessageResponse": { + "type": "structure", + "members": { + "messageId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The enqueued message's id. A 202 response carries no id (absent)." } + } + } + }, + "com.vercel.queues_data#SendMessage": { + "type": "operation", + "input": { "target": "com.vercel.queues_data#SendMessageRequest" }, + "output": { "target": "com.vercel.queues_data#SendMessageResponse" }, + "errors": [ + { "target": "com.vercel.queues_data#DuplicateMessage" }, + { "target": "com.vercel.queues_data#ConsumerDiscoveryFailed" }, + { "target": "com.vercel.queues_data#ConsumerRegistryNotConfigured" }, + { "target": "com.vercel.queues_data#QueueBadRequest" }, + { "target": "com.vercel.queues_data#QueueUnauthorized" }, + { "target": "com.vercel.queues_data#QueueForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "POST", "uri": "/api/v3/topic/{topic}", "code": 200 }, + "smithy.api#documentation": "Enqueue one message: `POST /api/v3/topic/{topic}` with the payload as the raw body and delivery options as `Vqs-*` headers." + } + }, + "com.vercel.queues_data#ReceiveMessagesRequest": { + "type": "structure", + "members": { + "region": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "OIDC bearer token.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "topic": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Topic (queue) name.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "consumerGroup": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Consumer group to lease under.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "deploymentId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Deployment partition pin (`Vqs-Deployment-Id`).", + "smithy.api#httpHeader": "Vqs-Deployment-Id" + } + }, + "visibilityTimeoutSeconds": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Lease duration (`Vqs-Visibility-Timeout-Seconds`).", + "smithy.api#httpHeader": "Vqs-Visibility-Timeout-Seconds" + } + }, + "maxMessages": { + "target": "smithy.api#Integer", + "traits": { "smithy.api#documentation": "Batch size, 1–10 (`Vqs-Max-Messages`).", "smithy.api#httpHeader": "Vqs-Max-Messages" } + } + } + }, + "com.vercel.queues_data#ReceiveMessagesResponse": { + "type": "structure", + "members": { + "messages": { + "target": "com.vercel.queues_data#QueueMessageList", + "traits": { + "smithy.api#documentation": "The leased batch — empty on a 204 (nothing available). Parts missing required `Vqs-*` headers are skipped (they stay leased and expire back).", + "com.vercel.protocols#multipartMessages": {}, + "smithy.api#required": {} + } + } + } + }, + "com.vercel.queues_data#ReceiveMessages": { + "type": "operation", + "input": { "target": "com.vercel.queues_data#ReceiveMessagesRequest" }, + "output": { "target": "com.vercel.queues_data#ReceiveMessagesResponse" }, + "errors": [ + { "target": "com.vercel.queues_data#QueueBadRequest" }, + { "target": "com.vercel.queues_data#QueueUnauthorized" }, + { "target": "com.vercel.queues_data#QueueForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "POST", "uri": "/api/v3/topic/{topic}/consumer/{consumerGroup}", "code": 200, "accept": "multipart/mixed" }, + "smithy.api#documentation": "Lease a batch: `POST /api/v3/topic/{topic}/consumer/{consumerGroup}` (Accept: multipart/mixed). The multipart parts are parsed into typed message records; 204 → empty batch." + } + }, + "com.vercel.queues_data#ReceiveMessageByIdRequest": { + "type": "structure", + "members": { + "region": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "OIDC bearer token.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "topic": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Topic (queue) name.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "consumerGroup": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Consumer group to lease under.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "messageId": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The message id to lease (large-body push deliveries fetch by id).", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "deploymentId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Deployment partition pin (`Vqs-Deployment-Id`).", + "smithy.api#httpHeader": "Vqs-Deployment-Id" + } + }, + "visibilityTimeoutSeconds": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Lease duration (`Vqs-Visibility-Timeout-Seconds`).", + "smithy.api#httpHeader": "Vqs-Visibility-Timeout-Seconds" + } + } + } + }, + "com.vercel.queues_data#ReceiveMessageByIdResponse": { + "type": "structure", + "members": { + "messages": { + "target": "com.vercel.queues_data#QueueMessageList", + "traits": { + "smithy.api#documentation": "The response's message part(s) — the leased message is the first entry.", + "com.vercel.protocols#multipartMessages": {}, + "smithy.api#required": {} + } + } + } + }, + "com.vercel.queues_data#ReceiveMessageById": { + "type": "operation", + "input": { "target": "com.vercel.queues_data#ReceiveMessageByIdRequest" }, + "output": { "target": "com.vercel.queues_data#ReceiveMessageByIdResponse" }, + "errors": [ + { "target": "com.vercel.queues_data#MessageNotFound" }, + { "target": "com.vercel.queues_data#MessageNotAvailable" }, + { "target": "com.vercel.queues_data#MessageAlreadyProcessed" }, + { "target": "com.vercel.queues_data#QueueBadRequest" }, + { "target": "com.vercel.queues_data#QueueUnauthorized" }, + { "target": "com.vercel.queues_data#QueueForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "POST", "uri": "/api/v3/topic/{topic}/consumer/{consumerGroup}/id/{messageId}", "code": 200, "accept": "multipart/mixed" }, + "smithy.api#documentation": "Lease one specific message by id (Accept: multipart/mixed)." + } + }, + "com.vercel.queues_data#AcknowledgeMessageRequest": { + "type": "structure", + "members": { + "region": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "OIDC bearer token.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "topic": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Topic (queue) name.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "consumerGroup": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Consumer group the lease belongs to.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "receiptHandle": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The delivery's lease handle.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "deploymentId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Deployment partition pin (`Vqs-Deployment-Id`).", + "smithy.api#httpHeader": "Vqs-Deployment-Id" + } + } + } + }, + "com.vercel.queues_data#AcknowledgeMessageResponse": { + "type": "structure", + "members": {} + }, + "com.vercel.queues_data#AcknowledgeMessage": { + "type": "operation", + "input": { "target": "com.vercel.queues_data#AcknowledgeMessageRequest" }, + "output": { "target": "com.vercel.queues_data#AcknowledgeMessageResponse" }, + "errors": [ + { "target": "com.vercel.queues_data#MessageNotFound" }, + { "target": "com.vercel.queues_data#MessageNotAvailable" }, + { "target": "com.vercel.queues_data#QueueBadRequest" }, + { "target": "com.vercel.queues_data#QueueUnauthorized" }, + { "target": "com.vercel.queues_data#QueueForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "DELETE", "uri": "/api/v3/topic/{topic}/consumer/{consumerGroup}/lease/{receiptHandle}", "code": 200 }, + "smithy.api#documentation": "Acknowledge (complete) a delivery: DELETE the lease." + } + }, + "com.vercel.queues_data#ExtendLeaseRequest": { + "type": "structure", + "members": { + "region": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host.", + "smithy.api#hostLabel": {}, + "smithy.api#required": {} + } + }, + "token": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "OIDC bearer token.", + "smithy.api#httpHeader": "authorization", + "smithy.api#required": {}, + "smithy.api#sensitive": {} + } + }, + "topic": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Topic (queue) name.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "consumerGroup": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "Consumer group the lease belongs to.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "receiptHandle": { + "target": "smithy.api#String", + "traits": { "smithy.api#documentation": "The delivery's lease handle.", "smithy.api#httpLabel": {}, "smithy.api#required": {} } + }, + "deploymentId": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Deployment partition pin (`Vqs-Deployment-Id`).", + "smithy.api#httpHeader": "Vqs-Deployment-Id" + } + }, + "visibilityTimeoutSeconds": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "New lease duration from now, in seconds (JSON body).", + "smithy.api#required": {} + } + } + } + }, + "com.vercel.queues_data#ExtendLeaseResponse": { + "type": "structure", + "members": {} + }, + "com.vercel.queues_data#ExtendLease": { + "type": "operation", + "input": { "target": "com.vercel.queues_data#ExtendLeaseRequest" }, + "output": { "target": "com.vercel.queues_data#ExtendLeaseResponse" }, + "errors": [ + { "target": "com.vercel.queues_data#MessageNotFound" }, + { "target": "com.vercel.queues_data#MessageNotAvailable" }, + { "target": "com.vercel.queues_data#QueueBadRequest" }, + { "target": "com.vercel.queues_data#QueueUnauthorized" }, + { "target": "com.vercel.queues_data#QueueForbidden" } + ], + "traits": { + "smithy.api#http": { "method": "PATCH", "uri": "/api/v3/topic/{topic}/consumer/{consumerGroup}/lease/{receiptHandle}", "code": 200 }, + "smithy.api#documentation": "Extend a delivery's visibility timeout: PATCH the lease with `{visibilityTimeoutSeconds}`." + } + } + } +} diff --git a/packages/vercel/patches/README.md b/packages/vercel/patches/README.md new file mode 100644 index 000000000..1e49eda70 --- /dev/null +++ b/packages/vercel/patches/README.md @@ -0,0 +1,23 @@ +# Vercel OpenAPI patches + +RFC-6902 JSON Patches applied to the committed OpenAPI document by `scripts/convert.ts`, **before** smithy conversion (the Neon/PlanetScale dialect — NOT Cloudflare's Smithy dialect). + +## Layout (mirrors `cloudflare/patches/{service}/{op}.json`) + +``` +patches/{service}/{operationId}.patch.json +``` + +- `{service}` = the distilled service module name (`src/services/{service}.ts`): `projects`, `dns`, `global_config`, `storage`, … +- `{operationId}` = the generated operation the patch targets (`getProject`, `createRecord`, `patchEdgeConfigItems`, …). **One file per operation** — a second fix for the same operation goes into the existing file's `patches` array, not a new file. +- Patches that necessarily span one concept across several new operations (e.g. adding an undocumented path with GET+POST) may use a concept name: `storage/connections.patch.json`. Keep these rare. +- Files apply in sorted relative-path order; a file is `{ "description": string, "patches": RfcOp[] }`. Stale targets warn-and-skip; malformed patches fail the run. +- Flat files at the root still apply (migration tolerance) but must be filed into a service directory before merging. + +## Regenerating + +```sh +bun run convert && bun scripts/generate.ts --resource {service} +``` + +Always under the repo's regen lock when agents run concurrently (`mkdir .regen-lock` spin — convert rewrites the shared `.generated-specs/`). diff --git a/packages/vercel/patches/access_groups/deleteAccessGroup.patch.json b/packages/vercel/patches/access_groups/deleteAccessGroup.patch.json new file mode 100644 index 000000000..c8ea823a8 --- /dev/null +++ b/packages/vercel/patches/access_groups/deleteAccessGroup.patch.json @@ -0,0 +1,12 @@ +{ + "description": "access_groups read/delete operations (GET/DELETE /v1/access-groups/{idOrName} and GET/DELETE /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}) omit the 404 the live API returns for a missing access group / project attachment, so distilled's typed union lacks NotFound on all four. The reconciler's observe step (read -> missing -> create) and the idempotent deletes branch on a typed NotFound tag; without it the 404 surfaces untyped. Add the 404 responses so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1access-groups~1{idOrName}/delete/responses/404", + "value": { + "description": "Access group not found" + } + } + ] +} diff --git a/packages/vercel/patches/access_groups/deleteAccessGroupProject.patch.json b/packages/vercel/patches/access_groups/deleteAccessGroupProject.patch.json new file mode 100644 index 000000000..3f75f7844 --- /dev/null +++ b/packages/vercel/patches/access_groups/deleteAccessGroupProject.patch.json @@ -0,0 +1,12 @@ +{ + "description": "access_groups read/delete operations (GET/DELETE /v1/access-groups/{idOrName} and GET/DELETE /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}) omit the 404 the live API returns for a missing access group / project attachment, so distilled's typed union lacks NotFound on all four. The reconciler's observe step (read -> missing -> create) and the idempotent deletes branch on a typed NotFound tag; without it the 404 surfaces untyped. Add the 404 responses so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1access-groups~1{accessGroupIdOrName}~1projects~1{projectId}/delete/responses/404", + "value": { + "description": "Access group project not found" + } + } + ] +} diff --git a/packages/vercel/patches/access_groups/listAccessGroups.patch.json b/packages/vercel/patches/access_groups/listAccessGroups.patch.json new file mode 100644 index 000000000..7bfb55f99 --- /dev/null +++ b/packages/vercel/patches/access_groups/listAccessGroups.patch.json @@ -0,0 +1,10 @@ +{ + "description": "access_groups.listAccessGroups (GET /v1/access-groups) models its 200 body as oneOf([{type:'object'}, {accessGroups,pagination}]). The bare untyped first arm collapses the generated union to unknown, making the typed accessGroups/pagination shape unreachable (ListAccessGroupsResponse = unknown). Promote the real second arm to be the schema so the provider's list/enumeration path gets the typed collection without casts.", + "patches": [ + { + "op": "move", + "from": "/paths/~1v1~1access-groups/get/responses/200/content/application~1json/schema/oneOf/1", + "path": "/paths/~1v1~1access-groups/get/responses/200/content/application~1json/schema" + } + ] +} diff --git a/packages/vercel/patches/access_groups/readAccessGroup.patch.json b/packages/vercel/patches/access_groups/readAccessGroup.patch.json new file mode 100644 index 000000000..7baed6e54 --- /dev/null +++ b/packages/vercel/patches/access_groups/readAccessGroup.patch.json @@ -0,0 +1,12 @@ +{ + "description": "access_groups read/delete operations (GET/DELETE /v1/access-groups/{idOrName} and GET/DELETE /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}) omit the 404 the live API returns for a missing access group / project attachment, so distilled's typed union lacks NotFound on all four. The reconciler's observe step (read -> missing -> create) and the idempotent deletes branch on a typed NotFound tag; without it the 404 surfaces untyped. Add the 404 responses so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1access-groups~1{idOrName}/get/responses/404", + "value": { + "description": "Access group not found" + } + } + ] +} diff --git a/packages/vercel/patches/access_groups/readAccessGroupProject.patch.json b/packages/vercel/patches/access_groups/readAccessGroupProject.patch.json new file mode 100644 index 000000000..5a22702a7 --- /dev/null +++ b/packages/vercel/patches/access_groups/readAccessGroupProject.patch.json @@ -0,0 +1,12 @@ +{ + "description": "access_groups read/delete operations (GET/DELETE /v1/access-groups/{idOrName} and GET/DELETE /v1/access-groups/{accessGroupIdOrName}/projects/{projectId}) omit the 404 the live API returns for a missing access group / project attachment, so distilled's typed union lacks NotFound on all four. The reconciler's observe step (read -> missing -> create) and the idempotent deletes branch on a typed NotFound tag; without it the 404 surfaces untyped. Add the 404 responses so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1access-groups~1{accessGroupIdOrName}~1projects~1{projectId}/get/responses/404", + "value": { + "description": "Access group project not found" + } + } + ] +} diff --git a/packages/vercel/patches/ai_gateway/listAiGatewayRules.patch.json b/packages/vercel/patches/ai_gateway/listAiGatewayRules.patch.json new file mode 100644 index 000000000..b86b2f13c --- /dev/null +++ b/packages/vercel/patches/ai_gateway/listAiGatewayRules.patch.json @@ -0,0 +1,12 @@ +{ + "description": "ai_gateway.listAiGatewayRules (GET /v1/ai-gateway/rules) is documented in the OpenAPI spec but the endpoint is not deployed on the live platform — it answers 404 {\"error\":{\"code\":\"not_found\",\"message\":\"The requested API endpoint was not found.\"}} (live-verified Aug 2026 on a Pro team). Add the 404 response so the availability rejection surfaces as the typed NotFound tag (pinned by the ungated AIGateway probe test) instead of an out-of-union catch-all.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1ai-gateway~1rules/get/responses/404", + "value": { + "description": "AI Gateway rules API not available" + } + } + ] +} diff --git a/packages/vercel/patches/bulk_redirects/getRedirects.patch.json b/packages/vercel/patches/bulk_redirects/getRedirects.patch.json new file mode 100644 index 000000000..075ff8c87 --- /dev/null +++ b/packages/vercel/patches/bulk_redirects/getRedirects.patch.json @@ -0,0 +1,29 @@ +{ + "description": "bulk_redirects.getRedirects (GET /v1/bulk-redirects): the 200 response is a oneOf whose first branch is a bare map `{type: object}`, degrading the whole union to unknown. Collapse to the full branch (version + redirects + pagination), then reconcile with live behavior probed 2026-08-13: a project with no redirects history returns `{redirects: [], version: null}` with NO pagination — mark version nullable and relax required to redirects only.", + "patches": [ + { + "op": "move", + "from": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/schema/oneOf/1", + "path": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/keepSchema" + }, + { + "op": "remove", + "path": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/schema" + }, + { + "op": "move", + "from": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/keepSchema", + "path": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/schema" + }, + { + "op": "add", + "path": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/schema/properties/version/nullable", + "value": true + }, + { + "op": "replace", + "path": "/paths/~1v1~1bulk-redirects/get/responses/200/content/application~1json/schema/required", + "value": ["redirects"] + } + ] +} diff --git a/packages/vercel/patches/bulk_redirects/getVersions.patch.json b/packages/vercel/patches/bulk_redirects/getVersions.patch.json new file mode 100644 index 000000000..13e9524e6 --- /dev/null +++ b/packages/vercel/patches/bulk_redirects/getVersions.patch.json @@ -0,0 +1,10 @@ +{ + "description": "bulk_redirects.getVersions (GET /v1/bulk-redirects/versions): the live API returns 404 `not_found` (\"Project not found.\") when the project no longer exists (probed 2026-08-13), but the spec declares no 404 — add it so the reconciler's observe step gets a typed NotFound.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1bulk-redirects~1versions/get/responses/404", + "value": { "description": "Project not found" } + } + ] +} diff --git a/packages/vercel/patches/bulk_redirects/stageRedirects.patch.json b/packages/vercel/patches/bulk_redirects/stageRedirects.patch.json new file mode 100644 index 000000000..9e8e3ed56 --- /dev/null +++ b/packages/vercel/patches/bulk_redirects/stageRedirects.patch.json @@ -0,0 +1,14 @@ +{ + "description": "bulk_redirects.stageRedirects (PUT /v1/bulk-redirects): (1) the live API requires `teamId` in the REQUEST BODY — a body without it fails 400 `validation_error` (\"projectId and teamId are required\") even when teamId is in the query string, and body-only teamId succeeds (both probed 2026-08-13). The spec declares teamId both as a query parameter and a required body property; the converter dedupes same-named members in favor of the query param, silently dropping the body member. Remove the query parameter so the body member survives codegen. (2) The live API returns 404 `not_found` for a deleted project — add the 404 response for a typed NotFound.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v1~1bulk-redirects/put/parameters/0" + }, + { + "op": "add", + "path": "/paths/~1v1~1bulk-redirects/put/responses/404", + "value": { "description": "Project not found" } + } + ] +} diff --git a/packages/vercel/patches/checks_v2/getProjectCheck.patch.json b/packages/vercel/patches/checks_v2/getProjectCheck.patch.json new file mode 100644 index 000000000..c8a983d10 --- /dev/null +++ b/packages/vercel/patches/checks_v2/getProjectCheck.patch.json @@ -0,0 +1,12 @@ +{ + "description": "getProjectCheck (GET /v2/projects/{projectIdOrName}/checks/{checkId}) omits the 404 the live API returns for a missing check (probed 2026-08-13: status 404, code 'check_not_found', message 'Check not found for ownerId: …, projectId: …, checkId: …'), so distilled's typed union lacks NotFound. The Check provider's observe step (getProjectCheck -> missing -> recreate) branches on the typed NotFound tag; without it the 404 surfaces as the out-of-union status class. Add the 404 response so the generator attaches NotFound.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v2~1projects~1{projectIdOrName}~1checks~1{checkId}/get/responses/404", + "value": { + "description": "Check not found" + } + } + ] +} diff --git a/packages/vercel/patches/deployments/getDeployment.patch.json b/packages/vercel/patches/deployments/getDeployment.patch.json new file mode 100644 index 000000000..d6cc6305c --- /dev/null +++ b/packages/vercel/patches/deployments/getDeployment.patch.json @@ -0,0 +1,28 @@ +{ + "description": "getDeployment's 200 response is a 3-arm oneOf: arm 0 omits readySubstate (arms 1-2 declare it), so the generated merged GetDeploymentResponseBody loses the field even though the live API returns it (readySubstate PROMOTED observed on every promoted production deployment — see alchemy processes/Vercel/PROBES.md). Also no arm's readyState enum includes DELETED, which the live API returns for a deleted deployment (DELETE probe: 200 {state:\"DELETED\"}, subsequent GETs report the deployment with readyState DELETED). Add readySubstate to arm 0 and DELETED to every top-level readyState enum.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v13~1deployments~1{idOrUrl}/get/responses/200/content/application~1json/schema/oneOf/0/properties/readySubstate", + "value": { + "type": "string", + "enum": ["PROMOTED", "ROLLING", "STAGED"] + } + }, + { + "op": "add", + "path": "/paths/~1v13~1deployments~1{idOrUrl}/get/responses/200/content/application~1json/schema/oneOf/0/properties/readyState/enum/-", + "value": "DELETED" + }, + { + "op": "add", + "path": "/paths/~1v13~1deployments~1{idOrUrl}/get/responses/200/content/application~1json/schema/oneOf/1/properties/readyState/enum/-", + "value": "DELETED" + }, + { + "op": "add", + "path": "/paths/~1v13~1deployments~1{idOrUrl}/get/responses/200/content/application~1json/schema/oneOf/2/properties/readyState/enum/-", + "value": "DELETED" + } + ] +} diff --git a/packages/vercel/patches/deployments/getDeploymentFileContents.patch.json b/packages/vercel/patches/deployments/getDeploymentFileContents.patch.json new file mode 100644 index 000000000..6f9886f03 --- /dev/null +++ b/packages/vercel/patches/deployments/getDeploymentFileContents.patch.json @@ -0,0 +1,26 @@ +{ + "description": "getDeploymentFileContents' 200 response has NO content schema in the OpenAPI document, so the generated GetDeploymentFileContentsResponse is an empty struct and the decoded value drops the payload. The live API returns a JSON body { data: \"\" } with the file contents encoded as base64 (live-verified against a prebuilt deployment's .vc-config.json — see alchemy test/Vercel/Chains/QueueEvolution.test.ts, which reads the consumer function's experimentalTriggers out-of-band). Add the response schema so `data` survives decoding.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v8~1deployments~1{id}~1files~1{fileId}/get/responses/200", + "value": { + "description": "The file contents, base64-encoded inside a JSON envelope", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "string", + "description": "The file contents, base64-encoded" + } + }, + "required": ["data"] + } + } + } + } + } + ] +} diff --git a/packages/vercel/patches/dns/createRecord.patch.json b/packages/vercel/patches/dns/createRecord.patch.json new file mode 100644 index 000000000..20904e269 --- /dev/null +++ b/packages/vercel/patches/dns/createRecord.patch.json @@ -0,0 +1,131 @@ +{ + "description": "dns.createRecord (POST /v2/domains/{domain}/records) models its body as a per-record-type anyOf whose arms the request-body flattener drops, leaving only the top-level `type` property — name/value/ttl/mxPriority/srv/https/comment never reach CreateRecordRequest. Replace the requestBody schema with the flat merged object (field template: the already-correct updateRecord shape). All fields optional except `type`; per-type value constraints (ipv4/ipv6 formats, MX requiring mxPriority, SRV/HTTPS requiring their sub-objects) are enforced server-side.", + "patches": [ + { + "op": "replace", + "path": "/paths/~1v2~1domains~1{domain}~1records/post/requestBody/content/application~1json/schema", + "value": { + "type": "object", + "required": [ + "type" + ], + "additionalProperties": false, + "properties": { + "type": { + "description": "The type of record, it could be one of the valid DNS records.", + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "SRV", + "TXT", + "NS" + ] + }, + "name": { + "description": "A subdomain name or an empty string for the root domain. Required for every record type except SRV and HTTPS, whose name is derived from srv/https.", + "type": "string", + "example": "subdomain" + }, + "value": { + "description": "The record value (address, hostname, or text depending on the record type). Not used for SRV and HTTPS records, which use the srv/https objects instead.", + "type": "string", + "example": "192.0.2.42" + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "mxPriority": { + "description": "The MX priority value of the DNS record. Required for MX records.", + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + }, + "srv": { + "description": "The SRV record payload. Required for SRV records.", + "type": "object", + "additionalProperties": false, + "required": [ + "target", + "weight", + "port", + "priority" + ], + "properties": { + "target": { + "description": "The SRV target hostname.", + "type": "string", + "example": "example2.com." + }, + "weight": { + "description": "The SRV weight.", + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + }, + "port": { + "description": "The SRV port.", + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 5000 + }, + "priority": { + "description": "The SRV priority.", + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + } + } + }, + "https": { + "description": "The HTTPS record payload. Required for HTTPS records.", + "type": "object", + "additionalProperties": false, + "required": [ + "priority", + "target" + ], + "properties": { + "priority": { + "description": "The HTTPS priority.", + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + }, + "target": { + "description": "The HTTPS target hostname.", + "type": "string", + "example": "host.example.com" + }, + "params": { + "description": "The HTTPS parameter string.", + "type": "string", + "example": "alpn=h2,h3" + } + } + }, + "comment": { + "description": "A comment to add context on what this DNS record is for", + "type": "string", + "maxLength": 500, + "example": "used to verify ownership of domain" + } + } + } + } + ] +} diff --git a/packages/vercel/patches/domains/createOrTransferDomain.patch.json b/packages/vercel/patches/domains/createOrTransferDomain.patch.json new file mode 100644 index 000000000..399098c95 --- /dev/null +++ b/packages/vercel/patches/domains/createOrTransferDomain.patch.json @@ -0,0 +1,41 @@ +{ + "description": "domains.createOrTransferDomain (POST /v7/domains) models its body as a top-level `method` property plus an add/move-in oneOf whose arms the request-body flattener drops, leaving only `method` — `name` (required by both arms) never reaches CreateOrTransferDomainRequest, so the operation cannot express which domain to add. Replace the requestBody schema with the flat merged object. NOTE (live-verified 2026-08-13): the SERVER also enforces the oneOf, and `method` has no enum in either arm, so a body of `{name, method: \"add\"}` matches BOTH arms and is rejected with 400 `should match exactly one schema in oneOf` — callers must send a bare `{name}` (plus optional cdnEnabled/zone) to add, and `{name, method: \"move-in\", token}` to move in. All fields optional except `name`; the add/move-in arm constraints are enforced server-side.", + "patches": [ + { + "op": "replace", + "path": "/paths/~1v7~1domains/post/requestBody/content/application~1json/schema", + "value": { + "type": "object", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "description": "The domain name you want to add.", + "type": "string", + "example": "example.com" + }, + "method": { + "description": "The domain operation to perform. Omit (or `add`) to add the domain; `move-in` moves a domain from another Vercel account using `token`. Live behavior: sending `method: \"add\"` together with `name` fails the server-side oneOf validation — omit `method` entirely when adding.", + "type": "string", + "example": "move-in" + }, + "cdnEnabled": { + "description": "Whether the domain has the Vercel Edge Network enabled or not.", + "type": "boolean", + "example": true + }, + "zone": { + "description": "Whether to create a DNS zone on Vercel. Set `true` if using Vercel nameservers (required before any DNS records can be created for the domain).", + "type": "boolean" + }, + "token": { + "description": "The move-in token from the Move Requested email. Only used with `method: \"move-in\"`.", + "type": "string" + } + } + } + } + ] +} diff --git a/packages/vercel/patches/environment/createCustomEnvironment.patch.json b/packages/vercel/patches/environment/createCustomEnvironment.patch.json new file mode 100644 index 000000000..97260e9cf --- /dev/null +++ b/packages/vercel/patches/environment/createCustomEnvironment.patch.json @@ -0,0 +1,9 @@ +{ + "description": "environment.createCustomEnvironment / environment.updateCustomEnvironment: the request BODY carries `slug` (the custom environment's name to create / rename to), but both operations also declare a `slug` QUERY parameter (team slug, redundant with `teamId`). The converter's parameter+body flattening drops the body property on the name collision, so the generated requests cannot name the environment at all (creates fall back to a server-assigned slug and renames are unrepresentable). Remove the redundant team-slug query parameter from both operations so the body `slug` survives; team scoping remains available via `teamId`.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v9~1projects~1{idOrName}~1custom-environments/post/parameters/2" + } + ] +} diff --git a/packages/vercel/patches/environment/createSharedEnvVariable.patch.json b/packages/vercel/patches/environment/createSharedEnvVariable.patch.json new file mode 100644 index 000000000..747fbefc5 --- /dev/null +++ b/packages/vercel/patches/environment/createSharedEnvVariable.patch.json @@ -0,0 +1,12 @@ +{ + "description": "Shared Environment Variable operations omit statuses the live API returns (live-verified 2026-08-13): environment.getSharedEnvVar answers 404 `id_not_found` for an unknown id; environment.updateSharedEnvVariable answers 404 `id_not_found` when any referenced id is unknown (NOT a `failed[]` envelope entry); environment.deleteSharedEnvVariable answers 404 `id_not_found` when an id is already gone (the idempotent-delete path catches this); environment.createSharedEnvVariable answers 409 `existing_key_and_target` when the key already exists for the selected targets (NOT a `failed[]` envelope entry). Add the statuses so the generator attaches typed NotFound/Conflict errors to these operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1env/post/responses/409", + "value": { + "description": "The Shared Environment Variable key already exists for the selected target(s)" + } + } + ] +} diff --git a/packages/vercel/patches/environment/deleteSharedEnvVariable.patch.json b/packages/vercel/patches/environment/deleteSharedEnvVariable.patch.json new file mode 100644 index 000000000..3cfab1dd4 --- /dev/null +++ b/packages/vercel/patches/environment/deleteSharedEnvVariable.patch.json @@ -0,0 +1,12 @@ +{ + "description": "Shared Environment Variable operations omit statuses the live API returns (live-verified 2026-08-13): environment.getSharedEnvVar answers 404 `id_not_found` for an unknown id; environment.updateSharedEnvVariable answers 404 `id_not_found` when any referenced id is unknown (NOT a `failed[]` envelope entry); environment.deleteSharedEnvVariable answers 404 `id_not_found` when an id is already gone (the idempotent-delete path catches this); environment.createSharedEnvVariable answers 409 `existing_key_and_target` when the key already exists for the selected targets (NOT a `failed[]` envelope entry). Add the statuses so the generator attaches typed NotFound/Conflict errors to these operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1env/delete/responses/404", + "value": { + "description": "A referenced Shared Environment Variable id was not found" + } + } + ] +} diff --git a/packages/vercel/patches/environment/getProjectsByIdOrNameCustomEnvironments.patch.json b/packages/vercel/patches/environment/getProjectsByIdOrNameCustomEnvironments.patch.json new file mode 100644 index 000000000..8790a935e --- /dev/null +++ b/packages/vercel/patches/environment/getProjectsByIdOrNameCustomEnvironments.patch.json @@ -0,0 +1,12 @@ +{ + "description": "environment.getProjectsByIdOrNameCustomEnvironments omits the 404 the live API returns when the project itself does not exist (code `not_found`, message \"Project not found.\" — live-verified 2026-08-13). The custom-environment provider's parent fan-out `list` enumerates projects and lists each project's environments; a project deleted between enumeration and listing must surface as a typed NotFound so the fan-out can skip it.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v9~1projects~1{idOrName}~1custom-environments/get/responses/404", + "value": { + "description": "Project not found" + } + } + ] +} diff --git a/packages/vercel/patches/environment/getSharedEnvVar.patch.json b/packages/vercel/patches/environment/getSharedEnvVar.patch.json new file mode 100644 index 000000000..49dfd4c7e --- /dev/null +++ b/packages/vercel/patches/environment/getSharedEnvVar.patch.json @@ -0,0 +1,12 @@ +{ + "description": "Shared Environment Variable operations omit statuses the live API returns (live-verified 2026-08-13): environment.getSharedEnvVar answers 404 `id_not_found` for an unknown id; environment.updateSharedEnvVariable answers 404 `id_not_found` when any referenced id is unknown (NOT a `failed[]` envelope entry); environment.deleteSharedEnvVariable answers 404 `id_not_found` when an id is already gone (the idempotent-delete path catches this); environment.createSharedEnvVariable answers 409 `existing_key_and_target` when the key already exists for the selected targets (NOT a `failed[]` envelope entry). Add the statuses so the generator attaches typed NotFound/Conflict errors to these operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1env~1{id}/get/responses/404", + "value": { + "description": "Shared Environment Variable not found" + } + } + ] +} diff --git a/packages/vercel/patches/environment/removeCustomEnvironment.patch.json b/packages/vercel/patches/environment/removeCustomEnvironment.patch.json new file mode 100644 index 000000000..b73a1d37d --- /dev/null +++ b/packages/vercel/patches/environment/removeCustomEnvironment.patch.json @@ -0,0 +1,12 @@ +{ + "description": "environment.removeCustomEnvironment omits the 404 the live API returns for a missing environment (code `not_found`, message \"Environment not found.\" — live-verified 2026-08-13), so distilled's typed union lacks NotFound. The idempotent delete path catches the typed NotFound tag; without it the 404 surfaces as the catch-all. (Deleting by a still-existing id twice answers 200 both times; only an unknown slug/id 404s.)", + "patches": [ + { + "op": "add", + "path": "/paths/~1v9~1projects~1{idOrName}~1custom-environments~1{environmentSlugOrId}/delete/responses/404", + "value": { + "description": "Environment not found" + } + } + ] +} diff --git a/packages/vercel/patches/environment/updateCustomEnvironment.patch.json b/packages/vercel/patches/environment/updateCustomEnvironment.patch.json new file mode 100644 index 000000000..d9f2b454a --- /dev/null +++ b/packages/vercel/patches/environment/updateCustomEnvironment.patch.json @@ -0,0 +1,9 @@ +{ + "description": "environment.createCustomEnvironment / environment.updateCustomEnvironment: the request BODY carries `slug` (the custom environment's name to create / rename to), but both operations also declare a `slug` QUERY parameter (team slug, redundant with `teamId`). The converter's parameter+body flattening drops the body property on the name collision, so the generated requests cannot name the environment at all (creates fall back to a server-assigned slug and renames are unrepresentable). Remove the redundant team-slug query parameter from both operations so the body `slug` survives; team scoping remains available via `teamId`.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v9~1projects~1{idOrName}~1custom-environments~1{environmentSlugOrId}/patch/parameters/3" + } + ] +} diff --git a/packages/vercel/patches/environment/updateSharedEnvVariable.patch.json b/packages/vercel/patches/environment/updateSharedEnvVariable.patch.json new file mode 100644 index 000000000..cbbe49456 --- /dev/null +++ b/packages/vercel/patches/environment/updateSharedEnvVariable.patch.json @@ -0,0 +1,12 @@ +{ + "description": "Shared Environment Variable operations omit statuses the live API returns (live-verified 2026-08-13): environment.getSharedEnvVar answers 404 `id_not_found` for an unknown id; environment.updateSharedEnvVariable answers 404 `id_not_found` when any referenced id is unknown (NOT a `failed[]` envelope entry); environment.deleteSharedEnvVariable answers 404 `id_not_found` when an id is already gone (the idempotent-delete path catches this); environment.createSharedEnvVariable answers 409 `existing_key_and_target` when the key already exists for the selected targets (NOT a `failed[]` envelope entry). Add the statuses so the generator attaches typed NotFound/Conflict errors to these operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1env/patch/responses/404", + "value": { + "description": "A referenced Shared Environment Variable id was not found" + } + } + ] +} diff --git a/packages/vercel/patches/feature_flags/createFlag.patch.json b/packages/vercel/patches/feature_flags/createFlag.patch.json new file mode 100644 index 000000000..b9ebd73b1 --- /dev/null +++ b/packages/vercel/patches/feature_flags/createFlag.patch.json @@ -0,0 +1,9 @@ +{ + "description": "createFlag's request body carries a REQUIRED `slug` member (the flag's per-project key — live-verified 2026-08-13: omitting it is impossible, the API 201s only with it) that collides with the team-slug `slug` query parameter; the converter resolves the name collision by dropping the body member, so the generated CreateFlagRequest cannot name the flag at all. Remove the redundant team-slug query parameter (team scoping goes through `teamId`, the convention every alchemy provider uses) so the body `slug` survives codegen.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v1~1projects~1{projectIdOrName}~1feature-flags~1flags/put/parameters/2" + } + ] +} diff --git a/packages/vercel/patches/global_config/createEdgeConfig.patch.json b/packages/vercel/patches/global_config/createEdgeConfig.patch.json new file mode 100644 index 000000000..7a2bf6d18 --- /dev/null +++ b/packages/vercel/patches/global_config/createEdgeConfig.patch.json @@ -0,0 +1,9 @@ +{ + "description": "global_config.createEdgeConfig (POST /v1/global-config) declares a `slug` query parameter (team slug) that collides with the required body property `slug` (the config name) in the flattened request struct, so the body slug is dropped and CreateEdgeConfigRequest cannot express the config name at all (live-verified: create without body slug 400s, with body slug 201s). Remove the redundant `slug` query parameter (teamId covers team scoping) so the body property survives flattening.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v1~1global-config/post/parameters/1" + } + ] +} diff --git a/packages/vercel/patches/global_config/getEdgeConfigTokens.patch.json b/packages/vercel/patches/global_config/getEdgeConfigTokens.patch.json new file mode 100644 index 000000000..e037f4217 --- /dev/null +++ b/packages/vercel/patches/global_config/getEdgeConfigTokens.patch.json @@ -0,0 +1,15 @@ +{ + "description": "global_config.getEdgeConfigTokens (GET /v1/global-config/{edgeConfigId}/tokens) documents the 200 response as a single EdgeConfigToken object, but the live API returns a JSON array of them (same class of spec bug as getEdgeConfigs). Wrap the response schema in an array so GetEdgeConfigTokensResponse types as the list the API actually returns; needed to enumerate a config's tokens (e.g. test-side leak verification).", + "patches": [ + { + "op": "replace", + "path": "/paths/~1v1~1global-config~1{edgeConfigId}~1tokens/get/responses/200/content/application~1json/schema", + "value": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeConfigToken" + } + } + } + ] +} diff --git a/packages/vercel/patches/global_config/getEdgeConfigs.patch.json b/packages/vercel/patches/global_config/getEdgeConfigs.patch.json new file mode 100644 index 000000000..9945e4973 --- /dev/null +++ b/packages/vercel/patches/global_config/getEdgeConfigs.patch.json @@ -0,0 +1,129 @@ +{ + "description": "global_config.getEdgeConfigs (GET /v1/global-config) documents the 200 response as a single Edge Config object, but the live API returns a JSON array of them (live-verified: `[]` on empty team, `[{...}]` after create). Wrap the response schema in an array so GetEdgeConfigsResponse types as the list the API actually returns; needed by the provider's read fallback (find-by-slug after state loss).", + "patches": [ + { + "op": "replace", + "path": "/paths/~1v1~1global-config/get/responses/200/content/application~1json/schema", + "value": { + "type": "array", + "items": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string", + "description": "The ID of the user who created the Edge Config, optional because it is not always set." + }, + "ownerId": { + "type": "string" + }, + "slug": { + "type": "string", + "description": "Name for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experimentation" + ] + }, + "resourceId": { + "type": "string" + } + }, + "required": [ + "resourceId", + "type" + ], + "type": "object" + } + ] + }, + "deletedAt": { + "nullable": true, + "type": "number" + }, + "transfer": { + "properties": { + "fromAccountId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "doneAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "doneAt", + "fromAccountId", + "startedAt" + ], + "type": "object", + "description": "Keeps track of the current state of the Edge Config while it gets transferred." + }, + "schema": { + "type": "object" + }, + "syncedToDynamoAt": { + "type": "number", + "description": "Timestamp of when the Edge Config was synced to DynamoDB initially. It is only set when syncing the entire Edge Config, not when updating." + }, + "sizeInBytes": { + "type": "number" + }, + "itemCount": { + "type": "number" + } + }, + "required": [ + "createdAt", + "digest", + "id", + "itemCount", + "ownerId", + "sizeInBytes", + "slug", + "updatedAt" + ], + "type": "object", + "description": "List of all global configs." + } + } + } + ] +} diff --git a/packages/vercel/patches/global_config/patchEdgeConfigItems.patch.json b/packages/vercel/patches/global_config/patchEdgeConfigItems.patch.json new file mode 100644 index 000000000..f52fa777b --- /dev/null +++ b/packages/vercel/patches/global_config/patchEdgeConfigItems.patch.json @@ -0,0 +1,9 @@ +{ + "description": "global_config.patchEdgeConfigItems (PATCH /v1/global-config/{edgeConfigId}/items) models each items[] entry as a oneOf arm carrying a constraint-only inner anyOf (operation/key/value requiredness combinations); the converter's union pass degrades every arm to an `operation`-only struct, so key/value/description never reach PatchEdgeConfigItemsRequest. Strip the inner anyOf so the entry types as the flat object (operation/key/value/description); the per-operation requiredness is enforced server-side (live-verified: upsert+delete batch 200s).", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v1~1global-config~1{edgeConfigId}~1items/patch/requestBody/content/application~1json/schema/properties/items/items/oneOf/0/anyOf" + } + ] +} diff --git a/packages/vercel/patches/global_config/updateEdgeConfig.patch.json b/packages/vercel/patches/global_config/updateEdgeConfig.patch.json new file mode 100644 index 000000000..244b7df4d --- /dev/null +++ b/packages/vercel/patches/global_config/updateEdgeConfig.patch.json @@ -0,0 +1,9 @@ +{ + "description": "global_config.updateEdgeConfig (PUT /v1/global-config/{edgeConfigId}) has the same query-vs-body `slug` collision as createEdgeConfig: the required body property `slug` (the new config name) is dropped from UpdateEdgeConfigRequest, leaving the rename operation with no way to send its only body field (live-verified: PUT with body slug 200s and renames). Remove the redundant `slug` query parameter so the body property survives flattening.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v1~1global-config~1{edgeConfigId}/put/parameters/2" + } + ] +} diff --git a/packages/vercel/patches/microfrontends/getMicrofrontendsGroups.patch.json b/packages/vercel/patches/microfrontends/getMicrofrontendsGroups.patch.json new file mode 100644 index 000000000..a667fe150 --- /dev/null +++ b/packages/vercel/patches/microfrontends/getMicrofrontendsGroups.patch.json @@ -0,0 +1,63 @@ +{ + "description": "getMicrofrontendsGroups (GET /v1/microfrontends/groups) declares its 200 response as an anonymous `{type: object}`, degrading the generated GetMicrofrontendsGroupsResponse to `unknown`. This list is the ONLY endpoint exposing group metadata (id/name/slug/fallbackEnvironment) — the group-by-id endpoint returns only member projects — so the MicrofrontendsGroup provider's observe step depends on it being typed. Replace the schema with the live-observed shape (probed 2026-08-13: { groups: [{ group, projects }], maxMicrofrontendsGroupsPerTeam, maxMicrofrontendsPerGroup }); unknown extra fields stay permitted (additionalProperties is left open).", + "patches": [ + { + "op": "replace", + "path": "/paths/~1v1~1microfrontends~1groups/get/responses/200/content/application~1json/schema", + "value": { + "type": "object", + "required": ["groups"], + "properties": { + "groups": { + "type": "array", + "items": { + "type": "object", + "required": ["group", "projects"], + "properties": { + "group": { + "type": "object", + "required": ["id", "name", "slug"], + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "slug": { "type": "string" }, + "fallbackEnvironment": { "type": "string" }, + "createdAt": { "type": "number" }, + "updatedAt": { "type": "number" } + } + }, + "projects": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "name"], + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "microfrontends": { + "type": "object", + "required": ["enabled"], + "properties": { + "enabled": { "type": "boolean" }, + "groupIds": { + "type": "array", + "items": { "type": "string" } + }, + "isDefaultApp": { "type": "boolean" }, + "defaultRoute": { "type": "string" }, + "updatedAt": { "type": "number" } + } + } + } + } + } + } + } + }, + "maxMicrofrontendsGroupsPerTeam": { "type": "number" }, + "maxMicrofrontendsPerGroup": { "type": "number" } + } + } + } + ] +} diff --git a/packages/vercel/patches/project_members/addProjectMember.patch.json b/packages/vercel/patches/project_members/addProjectMember.patch.json new file mode 100644 index 000000000..49f45bbef --- /dev/null +++ b/packages/vercel/patches/project_members/addProjectMember.patch.json @@ -0,0 +1,10 @@ +{ + "description": "project_members.addProjectMember (POST /v1/projects/{idOrName}/members): the live API returns 404 `not_found` (\"Project not found.\") when the target project no longer exists (probed 2026-08-13), but the spec declares no 404 — add it so a vanished host project surfaces as a typed NotFound instead of the catch-all. (Role-combination rejections like `invalid_team_and_project_role_combination` and unknown-uid `not_a_member` arrive as declared 400s and are already typed BadRequest.)", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1projects~1{idOrName}~1members/post/responses/404", + "value": { "description": "Project not found" } + } + ] +} diff --git a/packages/vercel/patches/project_members/getProjectMembers.patch.json b/packages/vercel/patches/project_members/getProjectMembers.patch.json new file mode 100644 index 000000000..3ca05365f --- /dev/null +++ b/packages/vercel/patches/project_members/getProjectMembers.patch.json @@ -0,0 +1,28 @@ +{ + "description": "project_members.getProjectMembers (GET /v1/projects/{idOrName}/members): (1) the 200 response is a oneOf whose first branch is a bare `{type: object}`, which degrades the whole union to unknown — collapse it to the real paginated shape so `{members, pagination}` types cleanly; (2) the live API returns `pagination: {}` on a fresh project (probed 2026-08-13), so drop the pagination sub-required; (3) the live API returns 404 `not_found` for a deleted/missing project — add the 404 response so the reconciler's observe step gets a typed NotFound.", + "patches": [ + { + "op": "move", + "from": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/200/content/application~1json/schema/oneOf/1", + "path": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/200/content/application~1json/keepSchema" + }, + { + "op": "remove", + "path": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/200/content/application~1json/schema" + }, + { + "op": "move", + "from": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/200/content/application~1json/keepSchema", + "path": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/200/content/application~1json/schema" + }, + { + "op": "remove", + "path": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/200/content/application~1json/schema/properties/pagination/required" + }, + { + "op": "add", + "path": "/paths/~1v1~1projects~1{idOrName}~1members/get/responses/404", + "value": { "description": "Project not found" } + } + ] +} diff --git a/packages/vercel/patches/project_members/removeProjectMember.patch.json b/packages/vercel/patches/project_members/removeProjectMember.patch.json new file mode 100644 index 000000000..92833a94d --- /dev/null +++ b/packages/vercel/patches/project_members/removeProjectMember.patch.json @@ -0,0 +1,10 @@ +{ + "description": "project_members.removeProjectMember (DELETE /v1/projects/{idOrName}/members/{uid}): the live API returns 404 `not_found` both for a non-member uid (\"Team Membership not found.\") and for a deleted project (\"Project not found.\") — probed 2026-08-13 — but the spec declares no 404. The provider's idempotent delete catches the typed NotFound; add the response so it exists in the union.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1projects~1{idOrName}~1members~1{uid}/delete/responses/404", + "value": { "description": "Project or membership not found" } + } + ] +} diff --git a/packages/vercel/patches/project_routes/getRouteVersions.patch.json b/packages/vercel/patches/project_routes/getRouteVersions.patch.json new file mode 100644 index 000000000..83927c7e9 --- /dev/null +++ b/packages/vercel/patches/project_routes/getRouteVersions.patch.json @@ -0,0 +1,10 @@ +{ + "description": "project_routes.getRouteVersions (GET /v1/projects/{projectId}/routes/versions): the live API returns 404 `not_found` (\"Project not found.\") when the project no longer exists (probed 2026-08-13), but the spec declares no 404 — add it so the reconciler's observe step gets a typed NotFound.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1projects~1{projectId}~1routes~1versions/get/responses/404", + "value": { "description": "Project not found" } + } + ] +} diff --git a/packages/vercel/patches/project_routes/getRoutes.patch.json b/packages/vercel/patches/project_routes/getRoutes.patch.json new file mode 100644 index 000000000..0f13ee848 --- /dev/null +++ b/packages/vercel/patches/project_routes/getRoutes.patch.json @@ -0,0 +1,34 @@ +{ + "description": "project_routes.getRoutes (GET /v1/projects/{projectId}/routes): the 200 response is a oneOf whose first branch is a bare `{type: object}`, degrading the whole union to unknown. Collapse to the richest branch (routes + version + limit), then reconcile with live behavior probed 2026-08-13: a project that has never staged routes returns `version: null` (mark version nullable), `limit`/`version` are absent on the diff-mode shape (relax required to routes only), and diff mode adds a `diffCount` number (declare it optional).", + "patches": [ + { + "op": "move", + "from": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/schema/oneOf/3", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/keepSchema" + }, + { + "op": "remove", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/schema" + }, + { + "op": "move", + "from": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/keepSchema", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/schema" + }, + { + "op": "add", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/schema/properties/version/nullable", + "value": true + }, + { + "op": "add", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/schema/properties/diffCount", + "value": { "type": "number", "description": "Number of staged routes that differ from production. Present only when the diff query parameter is set." } + }, + { + "op": "replace", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/get/responses/200/content/application~1json/schema/required", + "value": ["routes"] + } + ] +} diff --git a/packages/vercel/patches/project_routes/stageRoutes.patch.json b/packages/vercel/patches/project_routes/stageRoutes.patch.json new file mode 100644 index 000000000..b90121a6a --- /dev/null +++ b/packages/vercel/patches/project_routes/stageRoutes.patch.json @@ -0,0 +1,10 @@ +{ + "description": "project_routes.stageRoutes (PUT /v1/projects/{projectId}/routes): the live API returns 404 `not_found` (\"Project not found.\") when the project no longer exists (probed 2026-08-13), but the spec declares no 404 — add it so the provider's delete-time reset (stage empty + promote) can treat a vanished host project as a typed NotFound.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1projects~1{projectId}~1routes/put/responses/404", + "value": { "description": "Project not found" } + } + ] +} diff --git a/packages/vercel/patches/projects/createProjectEnv.patch.json b/packages/vercel/patches/projects/createProjectEnv.patch.json new file mode 100644 index 000000000..9e9eb047a --- /dev/null +++ b/packages/vercel/patches/projects/createProjectEnv.patch.json @@ -0,0 +1,13 @@ +{ + "description": "projects.createProjectEnv (POST /v10/projects/{idOrName}/env) carries a constraint-only inner anyOf ([{required:[target]},{required:[customEnvironmentIds]}]) on both oneOf arms (single env object, and the batch array's items). The converter's union pass sees that anyOf before the object properties, converts both constraint-only branches to Document, and the whole body degrades to unknown. Strip the inner anyOf from both arms so the body types as the proper env object (key/value/type/target/gitBranch/comment/customEnvironmentIds) and its batch-array form; the target-or-customEnvironmentIds requirement is enforced server-side.", + "patches": [ + { + "op": "remove", + "path": "/paths/~1v10~1projects~1{idOrName}~1env/post/requestBody/content/application~1json/schema/oneOf/0/anyOf" + }, + { + "op": "remove", + "path": "/paths/~1v10~1projects~1{idOrName}~1env/post/requestBody/content/application~1json/schema/oneOf/1/items/anyOf" + } + ] +} diff --git a/packages/vercel/patches/projects/deleteProject.patch.json b/packages/vercel/patches/projects/deleteProject.patch.json new file mode 100644 index 000000000..50e3aa0b0 --- /dev/null +++ b/packages/vercel/patches/projects/deleteProject.patch.json @@ -0,0 +1,12 @@ +{ + "description": "projects.getProject and projects.deleteProject (GET/DELETE /v9/projects/{idOrName}) omit the 404 response the live API returns for a missing project, so distilled's typed union lacks NotFound on both operations. The reconciler's observe step (getProject -> missing -> create) and the idempotent delete (deleteProject catching not-found) both branch on a typed NotFound tag; without it the 404 surfaces as the catch-all. Add the 404 responses so the generator attaches the status-class NotFound error to both operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v9~1projects~1{idOrName}/delete/responses/404", + "value": { + "description": "Project not found" + } + } + ] +} diff --git a/packages/vercel/patches/projects/filterProjectEnvs.patch.json b/packages/vercel/patches/projects/filterProjectEnvs.patch.json new file mode 100644 index 000000000..71ecb76e5 --- /dev/null +++ b/packages/vercel/patches/projects/filterProjectEnvs.patch.json @@ -0,0 +1,12 @@ +{ + "description": "projects.filterProjectEnvs (GET /v10/projects/{idOrName}/env) omits the 404 the live API returns when the project is gone, so the typed union lacks NotFound. The ProjectEnv resource's read path observes env rows on a possibly-deleted project and branches on a typed NotFound tag. Add the 404 response so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v10~1projects~1{idOrName}~1env/get/responses/404", + "value": { + "description": "Project not found" + } + } + ] +} diff --git a/packages/vercel/patches/projects/getProject.patch.json b/packages/vercel/patches/projects/getProject.patch.json new file mode 100644 index 000000000..b4daf3885 --- /dev/null +++ b/packages/vercel/patches/projects/getProject.patch.json @@ -0,0 +1,12 @@ +{ + "description": "projects.getProject and projects.deleteProject (GET/DELETE /v9/projects/{idOrName}) omit the 404 response the live API returns for a missing project, so distilled's typed union lacks NotFound on both operations. The reconciler's observe step (getProject -> missing -> create) and the idempotent delete (deleteProject catching not-found) both branch on a typed NotFound tag; without it the 404 surfaces as the catch-all. Add the 404 responses so the generator attaches the status-class NotFound error to both operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v9~1projects~1{idOrName}/get/responses/404", + "value": { + "description": "Project not found" + } + } + ] +} diff --git a/packages/vercel/patches/projects/getProjectDomains.patch.json b/packages/vercel/patches/projects/getProjectDomains.patch.json new file mode 100644 index 000000000..1de5618c5 --- /dev/null +++ b/packages/vercel/patches/projects/getProjectDomains.patch.json @@ -0,0 +1,12 @@ +{ + "description": "projects.getProjectDomains (GET /v9/projects/{idOrName}/domains) omits the 404 the live API returns when the project itself is gone, so the typed union lacks NotFound. The ProjectDomain resource's read path observes domains on a possibly-deleted project and branches on a typed NotFound tag; without it the 404 surfaces as the catch-all. Add the 404 response so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v9~1projects~1{idOrName}~1domains/get/responses/404", + "value": { + "description": "Project not found" + } + } + ] +} diff --git a/packages/vercel/patches/rolling_release/updateRollingReleaseConfig.patch.json b/packages/vercel/patches/rolling_release/updateRollingReleaseConfig.patch.json new file mode 100644 index 000000000..b48717741 --- /dev/null +++ b/packages/vercel/patches/rolling_release/updateRollingReleaseConfig.patch.json @@ -0,0 +1,68 @@ +{ + "description": "rolling_release.updateRollingReleaseConfig (PATCH /v1/projects/{idOrName}/rolling-release/config) has no requestBody in the spec, so UpdateRollingReleaseConfigRequest generates with only path/query members and the operation cannot send its configuration. Live-verified: PATCH with {enabled:true, advancementType, stages:[{targetPercentage, requireApproval?, duration?}], canaryResponseHeader?} 200s and writes the config (GET echoes target/stages/canaryResponseHeader); PATCH {enabled:false} 200s and clears it ({rollingRelease:null}). Add the requestBody so the flattened request carries the body members.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1projects~1{idOrName}~1rolling-release~1config/patch/requestBody", + "value": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether rolling releases are enabled for the project. `false` clears the configuration (equivalent to DELETE)." + }, + "advancementType": { + "type": "string", + "enum": [ + "automatic", + "manual-approval" + ], + "description": "How the rollout advances between stages: `automatic` (per-stage duration) or `manual-approval`." + }, + "stages": { + "type": "array", + "description": "An array of all the stages required during a deployment release. The final stage must have targetPercentage: 100.", + "items": { + "type": "object", + "required": [ + "targetPercentage" + ], + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)" + }, + "requireApproval": { + "type": "boolean", + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage" + }, + "linearShift": { + "type": "boolean", + "description": "Whether to linearly shift traffic over the duration of this stage" + } + } + } + }, + "canaryResponseHeader": { + "type": "boolean", + "description": "Whether requests served by the canary deployment should return a header indicating a canary was served." + } + } + } + } + } + } + } + ] +} diff --git a/packages/vercel/patches/storage/connections.patch.json b/packages/vercel/patches/storage/connections.patch.json new file mode 100644 index 000000000..fe6c0fcb2 --- /dev/null +++ b/packages/vercel/patches/storage/connections.patch.json @@ -0,0 +1,299 @@ +{ + "description": "storage: the store<->project connection endpoints are real but absent from the OpenAPI document (used by the Vercel CLI's `blob store add` flow; live-verified 2026-08-13 against the alchemy-test team). Adds getStorageStoreConnections (GET /v1/storage/stores/{storeId}/connections -> {connections: [...]}) and createStorageStoreConnection (POST, body {projectId, envVarEnvironments, type: \"integration\"} -> 201 empty body; injects a BLOB_READ_WRITE_TOKEN encrypted env var into the connected project) plus deleteStorageStoreConnection (DELETE /v1/storage/stores/{storeId}/connections/{connectionId} -> 201 empty body; also removes the injected env var). A duplicate connect returns 400 code `store_project_connection_not_unique`. FIX 2026-08-14: the paths MUST carry the /v1 version prefix \u2014 the unversioned POST /storage/stores/{storeId}/connections started returning 500 internal_server_error (live-observed; the versioned /v1 path returns 201), so all three connection operations are now registered under /v1.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1storage~1stores~1{storeId}~1connections", + "value": { + "get": { + "description": "List the projects connected to a storage store.", + "operationId": "getStorageStoreConnections", + "security": [], + "summary": "List store connections", + "tags": [ + "storage" + ], + "parameters": [ + { + "name": "storeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "connections": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "project": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ] + }, + "envVarPrefix": { + "nullable": true, + "type": "string" + }, + "envVarEnvironments": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + } + }, + "required": [ + "id", + "projectId", + "envVarEnvironments" + ] + } + } + }, + "required": [ + "connections" + ] + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "" + }, + "403": { + "description": "" + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + } + }, + "post": { + "description": "Connect a storage store to a project. Injects the store's token env var (e.g. BLOB_READ_WRITE_TOKEN) into the project for the chosen environments.", + "operationId": "createStorageStoreConnection", + "security": [], + "summary": "Connect a store to a project", + "tags": [ + "storage" + ], + "parameters": [ + { + "name": "storeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "projectId": { + "type": "string" + }, + "envVarEnvironments": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + }, + "type": { + "type": "string", + "enum": [ + "integration" + ] + } + }, + "required": [ + "projectId", + "envVarEnvironments", + "type" + ] + } + } + } + }, + "responses": { + "201": { + "description": "The connection was created (empty body)." + }, + "400": { + "description": "Invalid request, or the project is already connected to the store in one of the chosen environments (code store_project_connection_not_unique)." + }, + "401": { + "description": "" + }, + "402": { + "description": "" + }, + "403": { + "description": "" + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + } + } + } + }, + { + "op": "add", + "path": "/paths/~1v1~1storage~1stores~1{storeId}~1connections~1{connectionId}", + "value": { + "delete": { + "description": "Disconnect a storage store from a project. Also removes the env var the connection injected into the project.", + "operationId": "deleteStorageStoreConnection", + "security": [], + "summary": "Disconnect a store from a project", + "tags": [ + "storage" + ], + "parameters": [ + { + "name": "storeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "connectionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "The connection was removed (empty body; the live API answers 201)." + }, + "400": { + "description": "" + }, + "401": { + "description": "" + }, + "403": { + "description": "" + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + } + } + } + } + ] +} diff --git a/packages/vercel/patches/storage/createStorageStoresBlob.patch.json b/packages/vercel/patches/storage/createStorageStoresBlob.patch.json new file mode 100644 index 000000000..b21698c15 --- /dev/null +++ b/packages/vercel/patches/storage/createStorageStoresBlob.patch.json @@ -0,0 +1,86 @@ +{ + "description": "storage: getStorageStoresById's and createStorageStoresBlob's declared response schemas omit the store identity and configuration fields the live API returns (id, name, type, createdAt, updatedAt, billingState; the GET response additionally omits region, access, size, count, isTokenExpired). Live-verified 2026-08-13. The BlobStore reconciler observes name/access/region from GET and needs the id from the create response, so add them (id/name/type as required — always present on the wire). | storage: the three documented storage operations (createStorageStoresBlob, getStorageStoresById, deleteStorageStoresBlobById) omit the standard teamId/slug query parameters every other team-scoped operation declares. Team-scoped tokens infer the team, but the alchemy provider doctrine passes the resolved teamId on every call, so declare them.", + "patches": [ + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/properties/id", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/properties/name", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/properties/type", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/properties/createdAt", + "value": { + "type": "number" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/properties/updatedAt", + "value": { + "type": "number" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/properties/billingState", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/required/-", + "value": "id" + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/required/-", + "value": "name" + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/responses/200/content/application~1json/schema/properties/store/required/-", + "value": "type" + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/parameters/-", + "value": { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob/post/parameters/-", + "value": { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + } + ] +} diff --git a/packages/vercel/patches/storage/deleteStorageStoresBlobById.patch.json b/packages/vercel/patches/storage/deleteStorageStoresBlobById.patch.json new file mode 100644 index 000000000..9bd4d6748 --- /dev/null +++ b/packages/vercel/patches/storage/deleteStorageStoresBlobById.patch.json @@ -0,0 +1,29 @@ +{ + "description": "storage: the three documented storage operations (createStorageStoresBlob, getStorageStoresById, deleteStorageStoresBlobById) omit the standard teamId/slug query parameters every other team-scoped operation declares. Team-scoped tokens infer the team, but the alchemy provider doctrine passes the resolved teamId on every call, so declare them.", + "patches": [ + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob~1{id}/delete/parameters/-", + "value": { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1blob~1{id}/delete/parameters/-", + "value": { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + } + ] +} diff --git a/packages/vercel/patches/storage/getStorageStores.patch.json b/packages/vercel/patches/storage/getStorageStores.patch.json new file mode 100644 index 000000000..06b5268f1 --- /dev/null +++ b/packages/vercel/patches/storage/getStorageStores.patch.json @@ -0,0 +1,127 @@ +{ + "description": "storage: the account-wide store enumeration endpoint (GET /v1/storage/stores -> {stores: [...]}) is absent from the OpenAPI document (live-verified 2026-08-13). Needed by the BlobStore provider's `list` and read-without-state recovery paths (Vercel stores have no tags; ownership is deterministic naming + state, so finding a store by name requires enumeration).", + "patches": [ + { + "op": "add", + "path": "/paths/~1storage~1stores", + "value": { + "get": { + "description": "List every storage store (all types: blob, edge-config, ...) on the account or team.", + "operationId": "getStorageStores", + "security": [], + "summary": "List stores", + "tags": [ + "storage" + ], + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "stores": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "billingState": { + "type": "string" + }, + "status": { + "nullable": true, + "type": "string" + }, + "region": { + "type": "string" + }, + "access": { + "type": "string", + "enum": [ + "public", + "private" + ] + }, + "size": { + "type": "number" + }, + "count": { + "type": "number" + }, + "isTokenExpired": { + "type": "boolean" + } + }, + "required": [ + "id", + "name", + "type" + ] + } + } + }, + "required": [ + "stores" + ] + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "" + }, + "403": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + } + } + } + } + ] +} diff --git a/packages/vercel/patches/storage/getStorageStoresById.patch.json b/packages/vercel/patches/storage/getStorageStoresById.patch.json new file mode 100644 index 000000000..4336c658a --- /dev/null +++ b/packages/vercel/patches/storage/getStorageStoresById.patch.json @@ -0,0 +1,125 @@ +{ + "description": "storage: getStorageStoresById's and createStorageStoresBlob's declared response schemas omit the store identity and configuration fields the live API returns (id, name, type, createdAt, updatedAt, billingState; the GET response additionally omits region, access, size, count, isTokenExpired). Live-verified 2026-08-13. The BlobStore reconciler observes name/access/region from GET and needs the id from the create response, so add them (id/name/type as required — always present on the wire). | storage: the three documented storage operations (createStorageStoresBlob, getStorageStoresById, deleteStorageStoresBlobById) omit the standard teamId/slug query parameters every other team-scoped operation declares. Team-scoped tokens infer the team, but the alchemy provider doctrine passes the resolved teamId on every call, so declare them.", + "patches": [ + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/id", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/name", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/type", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/createdAt", + "value": { + "type": "number" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/updatedAt", + "value": { + "type": "number" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/billingState", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/region", + "value": { + "type": "string" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/access", + "value": { + "type": "string", + "enum": [ + "public", + "private" + ] + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/size", + "value": { + "type": "number" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/count", + "value": { + "type": "number" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/properties/isTokenExpired", + "value": { + "type": "boolean" + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/required/-", + "value": "id" + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/required/-", + "value": "name" + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/responses/200/content/application~1json/schema/properties/store/required/-", + "value": "type" + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/parameters/-", + "value": { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string" + } + } + }, + { + "op": "add", + "path": "/paths/~1storage~1stores~1{id}/get/parameters/-", + "value": { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string" + } + } + } + ] +} diff --git a/packages/vercel/patches/teams/deleteTeam.patch.json b/packages/vercel/patches/teams/deleteTeam.patch.json new file mode 100644 index 000000000..8e704cc18 --- /dev/null +++ b/packages/vercel/patches/teams/deleteTeam.patch.json @@ -0,0 +1,12 @@ +{ + "description": "teams.deleteTeam (DELETE /v1/teams/{teamId}) omits the 404 the live API returns for an already-deleted/missing team, so distilled's typed union lacks NotFound. The Team provider's idempotent delete branches on a typed NotFound tag (state persistence can fail after a successful delete, so delete must tolerate the team already being gone). Add the 404 response so the generator attaches the status-class NotFound error.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1teams~1{teamId}/delete/responses/404", + "value": { + "description": "Team not found" + } + } + ] +} diff --git a/packages/vercel/patches/teams/inviteUserToTeam.patch.json b/packages/vercel/patches/teams/inviteUserToTeam.patch.json new file mode 100644 index 000000000..36e82b92a --- /dev/null +++ b/packages/vercel/patches/teams/inviteUserToTeam.patch.json @@ -0,0 +1,64 @@ +{ + "description": "teams.inviteUserToTeam (POST /v2/teams/{teamId}/members) models its request body as an ARRAY of invitations, but the live API expects a single object — sending an array answers 400 {\"error\":{\"code\":\"bad_request\",\"message\":\"Expected an object\"}} while the object form works (live-verified: an object body with an invalid email reaches validation and answers code invalid_email). Replace the requestBody schema with the single-invitation object so the request fields flatten into InviteUserToTeamRequest.", + "patches": [ + { + "op": "replace", + "path": "/paths/~1v2~1teams~1{teamId}~1members/post/requestBody/content/application~1json/schema", + "value": { + "type": "object", + "required": ["email"], + "properties": { + "email": { + "type": "string", + "format": "email", + "description": "The email address of the user to invite", + "example": "john@example.com" + }, + "role": { + "type": "string", + "enum": [ + "OWNER", + "MEMBER", + "DEVELOPER", + "SECURITY", + "BILLING", + "VIEWER", + "VIEWER_FOR_PLUS", + "CONTRIBUTOR" + ], + "default": "VIEWER", + "description": "The role of the user to invite", + "example": "VIEWER" + }, + "projects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["role", "projectId"], + "properties": { + "projectId": { + "type": "string", + "maxLength": 64, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the project." + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER", + "PROJECT_GUEST" + ], + "example": "ADMIN", + "description": "Sets the project roles for the invited user" + } + } + } + } + } + } + } + ] +} diff --git a/packages/vercel/patches/web_analytics/createWebInsightsToggle.patch.json b/packages/vercel/patches/web_analytics/createWebInsightsToggle.patch.json new file mode 100644 index 000000000..0d409f958 --- /dev/null +++ b/packages/vercel/patches/web_analytics/createWebInsightsToggle.patch.json @@ -0,0 +1,34 @@ +{ + "description": "web_analytics.createWebInsightsToggle (POST /web/insights/toggle) declares only the projectId query parameter — no teamId/slug scoping (every other team-scoped Vercel op has them; live-verified the endpoint accepts and honors teamId) — and omits the 404 the live API returns when the project does not exist ({\"error\":{\"code\":\"not_found\",\"message\":\"Project not found.\"}}, live-verified). The WebAnalytics provider's delete path toggles analytics off and must treat a already-deleted project as gone via a typed NotFound tag. Add teamId/slug query params and the 404 response.", + "patches": [ + { + "op": "add", + "path": "/paths/~1web~1insights~1toggle/post/parameters/-", + "value": { + "name": "teamId", + "in": "query", + "required": false, + "description": "The Team identifier to perform the request on behalf of.", + "schema": { "type": "string" } + } + }, + { + "op": "add", + "path": "/paths/~1web~1insights~1toggle/post/parameters/-", + "value": { + "name": "slug", + "in": "query", + "required": false, + "description": "The Team slug to perform the request on behalf of.", + "schema": { "type": "string" } + } + }, + { + "op": "add", + "path": "/paths/~1web~1insights~1toggle/post/responses/404", + "value": { + "description": "Project not found" + } + } + ] +} diff --git a/packages/vercel/patches/webhooks/deleteWebhook.patch.json b/packages/vercel/patches/webhooks/deleteWebhook.patch.json new file mode 100644 index 000000000..fdc1011f6 --- /dev/null +++ b/packages/vercel/patches/webhooks/deleteWebhook.patch.json @@ -0,0 +1,12 @@ +{ + "description": "webhooks.getWebhook and webhooks.deleteWebhook (GET/DELETE /v1/webhooks/{id}) omit the 404 the live API returns for a missing webhook (probed 2026-08-13: status 404, code 'not_found', message 'Webhook not found.'), so distilled's typed union lacks NotFound on both operations. The Webhook provider's observe step (getWebhook -> missing -> recreate) and its idempotent delete both branch on the typed NotFound tag; without it the 404 surfaces as the out-of-union status class. Add the 404 responses so the generator attaches NotFound to both operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1webhooks~1{id}/delete/responses/404", + "value": { + "description": "Webhook not found" + } + } + ] +} diff --git a/packages/vercel/patches/webhooks/getWebhook.patch.json b/packages/vercel/patches/webhooks/getWebhook.patch.json new file mode 100644 index 000000000..d8207bb10 --- /dev/null +++ b/packages/vercel/patches/webhooks/getWebhook.patch.json @@ -0,0 +1,12 @@ +{ + "description": "webhooks.getWebhook and webhooks.deleteWebhook (GET/DELETE /v1/webhooks/{id}) omit the 404 the live API returns for a missing webhook (probed 2026-08-13: status 404, code 'not_found', message 'Webhook not found.'), so distilled's typed union lacks NotFound on both operations. The Webhook provider's observe step (getWebhook -> missing -> recreate) and its idempotent delete both branch on the typed NotFound tag; without it the 404 surfaces as the out-of-union status class. Add the 404 responses so the generator attaches NotFound to both operations.", + "patches": [ + { + "op": "add", + "path": "/paths/~1v1~1webhooks~1{id}/get/responses/404", + "value": { + "description": "Webhook not found" + } + } + ] +} diff --git a/packages/vercel/scripts/convert.ts b/packages/vercel/scripts/convert.ts index 2ffdb1bd3..f2a796fdf 100644 --- a/packages/vercel/scripts/convert.ts +++ b/packages/vercel/scripts/convert.ts @@ -106,10 +106,24 @@ let patchFiles = 0; let staleOps = 0; const badPatches: string[] = []; if (fs.existsSync(patchDir)) { - for (const pf of fs - .readdirSync(patchDir) - .filter((f) => f.endsWith(".patch.json")) - .sort((a, b) => a.localeCompare(b))) { + // Layout: `patches/{service}/{operation}.patch.json` — one directory per + // distilled service, one file per operation (multi-op additions may use a + // concept name, e.g. `storage/connections.patch.json`). Flat files at the + // root are tolerated for migration but should be filed under a service. + // Applied in sorted relative-path order. + const patchFilePaths: string[] = []; + for (const entry of fs.readdirSync(patchDir, { withFileTypes: true })) { + if (entry.isDirectory()) { + for (const f of fs.readdirSync(path.join(patchDir, entry.name))) { + if (f.endsWith(".patch.json")) { + patchFilePaths.push(`${entry.name}/${f}`); + } + } + } else if (entry.name.endsWith(".patch.json")) { + patchFilePaths.push(entry.name); + } + } + for (const pf of patchFilePaths.sort((a, b) => a.localeCompare(b))) { const parsed = JSON.parse( fs.readFileSync(path.join(patchDir, pf), "utf-8"), ) as PatchFile; @@ -317,6 +331,12 @@ for (const slug of [...tagBuckets.keys()].sort()) { // reached). It's declared on ~95 operations and is genuinely actionable // per operation, unlike the boilerplate statuses below. "402": "PaymentRequired", + // 449 is declared only on certs.issueCert: the pre-issuance "pretest" + // that fails when the requested common names don't resolve to Vercel + // yet (live: code `http_pretest_domain_not_resolving_to_vercel_error`). + // Without this mapping the declared 449 response is silently dropped + // and the failure funnels into the catch-all. + "449": "DomainPretestFailed", }, // 401/429/500/503 ride the common VercelOpError union, as does 410: // Vercel declares "Invalid API version" on nearly every operation, and it diff --git a/packages/vercel/scripts/generate.ts b/packages/vercel/scripts/generate.ts index 95ef5ceb4..7624fd61f 100644 --- a/packages/vercel/scripts/generate.ts +++ b/packages/vercel/scripts/generate.ts @@ -35,6 +35,8 @@ const NULLABLE_TRAIT = "com.distilled.openapi#nullable"; const ERROR_MATCHERS_TRAIT = "com.distilled.openapi#errorMatchers"; const RAW_RESPONSE_TRAIT = "com.distilled.openapi#rawResponse"; const SENSITIVE_TRAIT = "smithy.api#sensitive"; +const BINARY_RESPONSE_BODY_TRAIT = "com.vercel.protocols#binaryResponseBody"; +const MULTIPART_MESSAGES_TRAIT = "com.vercel.protocols#multipartMessages"; /** `access_groups` → `accessGroups` (the barrel's export name). */ const camel = (slug: string): string => @@ -109,12 +111,95 @@ const spec: SdkSpec = { }, }; +/** + * Spec variant for the DATA-PLANE services (hand-authored models in + * `manual-specs/` whose `metadata["distilled.protocol"]` names their + * protocol const — `BlobDataProtocol` / `QueuesDataProtocol` / + * `EdgeConfigDataProtocol` in `src/data-protocol.ts`). Same trait + * vocabulary as the management spec, plus: + * + * - `com.vercel.protocols#binaryResponseBody` — raw binary response body + * (blob content reads), delivered as buffered bytes with sibling + * `httpHeader` members projected from the response headers. + * - `com.vercel.protocols#multipartMessages` — multipart/mixed receive + * batches (queues), parsed into typed message records by the protocol. + * - `smithy.api#endpoint` hostPrefix on an operation → emitted as the op's + * `endpointHostPrefix` config (per-op endpoint templates, filled by + * `smithy.api#hostLabel` members). + * + * Data-plane auth is a per-call `sensitive` input member, so the generated + * ops require only an HttpClient (`VercelDataOpContext`) — never the + * management `Credentials`. + */ +const dataPlaneSpec = (protocol: string): SdkSpec => ({ + ...spec, + + extraBindings: [ + ...(spec.extraBindings ?? []), + { + // Endpoint-template label (`{region}`, `{store}`, `{origin}`): + // substituted into the base URL, never serialized elsewhere. Opted + // into per provider (NOT a generic binding) because AWS's + // `smithy.api#hostLabel` members must still serialize as normal + // members per their protocol. + trait: "smithy.api#hostLabel", + binding: "hostLabel", + pipe: "T.HostLabel()", + }, + { + trait: BINARY_RESPONSE_BODY_TRAIT, + binding: "binaryBody", + pipe: "T.BinaryResponseBody()", + tsType: "T.BinaryResponseBody", + }, + { + trait: MULTIPART_MESSAGES_TRAIT, + binding: "multipartMessages", + pipe: "T.MultipartMessages()", + }, + ], + + // Response-side binary payloads (queue message payload bytes) are real + // bytes, not the JSON prelude's string; request-side whole-body payloads + // keep the generic accepting union. + memberTsType: (m) => + SENSITIVE_TRAIT in m.traits + ? `string | Redacted.Redacted${m.nullable ? " | null" : ""}` + : m.target === "smithy.api#Blob" && m.binding !== "rawBody" + ? "Uint8Array" + : undefined, + + sourceNote: "manual-specs (hand-authored data-plane models)", + + operationDecl: { + contextType: "VercelDataOpContext", + commonErrorType: "VercelDataOpError", + commonErrorClasses: [], + protocol, + retry: "Retry.Retry", + extraConfig: (ctx) => { + const endpoint = ctx.op.def.traits?.["smithy.api#endpoint"] as + | { hostPrefix?: string } + | undefined; + return endpoint?.hostPrefix + ? [`endpointHostPrefix: ${JSON.stringify(endpoint.hostPrefix)}`] + : []; + }, + }, +}); + runGeneratorCli({ description: "Generate the Vercel Effect SDK from the Smithy models", root: `${import.meta.dir}/..`, // The RFC-6902 patch chain in patches/ applies to the OpenAPI document in // scripts/convert.ts — never to the Smithy models. patchesDir: false, + // Hand-authored models for the product data planes (Blob, Queues, Edge + // Config reads) that the management OpenAPI document doesn't cover. + manualSpecsDir: "manual-specs", barrelExportName: camel, - spec: () => spec, + spec: (model) => { + const protocol = model?.metadata?.["distilled.protocol"]; + return typeof protocol === "string" ? dataPlaneSpec(protocol) : spec; + }, }); diff --git a/packages/vercel/src/data-protocol.ts b/packages/vercel/src/data-protocol.ts new file mode 100644 index 000000000..9cac59e46 --- /dev/null +++ b/packages/vercel/src/data-protocol.ts @@ -0,0 +1,453 @@ +/** + * Vercel DATA-PLANE protocols — hand-written. + * + * Vercel's management API (`https://api.vercel.com`, `VERCEL_TOKEN` bearer) + * is only half the platform: three product data planes speak their own hosts + * and their own auth, none of which appear in the management OpenAPI + * document. The services generated from `manual-specs/` bind to the + * protocols here instead of {@link VercelProtocol}: + * + * - **Blob** (`blob_data`) — control ops on `https://blob.vercel-storage.com` + * (`VERCEL_BLOB_API_URL` overrides — local emulation), content reads on the + * per-store host `https://{storeIdLower}.{access}.blob.vercel-storage.com` + * (under an override: `{override}/{storeIdLower}.{access}`). Auth is the + * store's RW token (`vercel_blob_rw_…`), a PER-CALL input member — not the + * management token. + * - **Queues** (`queues_data`) — `https://{region}.vercel-queue.com/api/v3` + * (`VERCEL_QUEUE_BASE_URL` overrides the host; the `/api/v3` path prefix is + * part of the operation URIs and survives the override — the same contract + * `vercel dev`'s local broker uses). Auth is a per-call OIDC bearer. + * Bounded receives answer `multipart/mixed`; the protocol parses the parts + * into typed message records (`Vqs-*` part headers + payload bytes). + * - **Edge Config** (`edge_config_data`) — the READ plane + * `https://edge-config.vercel.com/{edgeConfigId}`. The per-call `origin` + * member IS the endpoint (a connection string's origin — local emulation + * points it at `http://localhost:`); auth is the minted read token. + * + * Every operation takes its bearer token as a typed, `sensitive` input + * member (`token`) — the protocol Bearer-prefixes it on the wire. None of + * these protocols resolve the management {@link Credentials} service, so the + * generated data-plane ops require only an `HttpClient`. + */ +import * as Effect from "effect/Effect"; +import type * as Layer from "effect/Layer"; +import type * as AST from "effect/SchemaAST"; +import type * as HttpClient from "effect/unstable/http/HttpClient"; +import type * as HttpClientError from "effect/unstable/http/HttpClientError"; +import type * as HttpClientResponse from "effect/unstable/http/HttpClientResponse"; +import type * as API from "@distilled.cloud/core/api"; +import { HTTP_STATUS_MAP } from "@distilled.cloud/core/errors"; +import { + getProps, + hasPropAnn, + nameOf, +} from "@distilled.cloud/core/protocol-http"; +import { headerSymbol } from "@distilled.cloud/core/trait"; +import { + makeRestProtocol, + type RestErrorEnvelope, +} from "@distilled.cloud/core/protocol-rest"; +import { + binaryResponseBodySymbol, + multipartMessagesSymbol, +} from "./traits.ts"; +import { Gone, PaymentRequired, UnknownVercelError } from "./errors.ts"; +import type { DefaultErrors } from "./errors.ts"; + +// ============================================================================= +// Shared surface +// ============================================================================= + +/** + * Error channel shared by every generated data-plane operation (plus the + * operation's own declared error classes). + */ +export type VercelDataOpError = + | DefaultErrors + | HttpClientError.HttpClientError; + +/** + * Context (requirements) of every generated data-plane operation. Data-plane + * auth is a per-call input member, so — unlike the management surface — + * there is no {@link Credentials} requirement. + */ +export type VercelDataOpContext = HttpClient.HttpClient; + +/** Bearer-prefix a raw token supplied as an `authorization` member. */ +const bearerPrefixAuthorization = (name: string, value: string): string => + name === "authorization" && !/^bearer /i.test(value) + ? `Bearer ${value}` + : value; + +/** + * Data-plane failures use the same `{ error: { code, message } }` envelope + * as the management API where they are JSON at all (queues answers plain + * text; the default `HTTP ` fallback covers it). + */ +const errorEnvelope = (body: unknown): RestErrorEnvelope | undefined => { + if (body === null || typeof body !== "object") return undefined; + const err = (body as Record).error; + if (err === null || typeof err !== "object") return undefined; + const e = err as Record; + return { + code: typeof e.code === "string" ? e.code : undefined, + message: typeof e.message === "string" ? e.message : undefined, + }; +}; + +const statusMap = { + ...HTTP_STATUS_MAP, + 402: PaymentRequired, + 410: Gone, +}; + +const unknownError = ({ + code, + message, + body, +}: { + readonly code?: string | number; + readonly message: string; + readonly body: unknown; +}) => + new UnknownVercelError({ + code: + typeof code === "string" + ? code + : code !== undefined + ? String(code) + : undefined, + message, + body, + }); + +const emptyToUndefined = (value: string | undefined): string | undefined => + value === undefined || value === "" ? undefined : value; + +const stripTrailingSlash = (value: string): string => value.replace(/\/+$/, ""); + +// ============================================================================= +// Blob data plane +// ============================================================================= + +/** Default Blob data-plane endpoint (control operations). */ +export const DEFAULT_BLOB_API_URL = "https://blob.vercel-storage.com"; + +/** + * Env var overriding the Blob data-plane endpoint (local emulation). Under + * an override, content reads move from the per-store host to + * `{override}/{storeIdLower}.{access}/{pathname}`. + */ +export const BLOB_API_URL_ENV = "VERCEL_BLOB_API_URL"; + +/** Wire version header sent with every Blob data-plane request. */ +export const BLOB_API_VERSION = "12"; + +interface BlobDataConfig { + readonly override: string | undefined; +} + +/** + * Decode a binary-body success: the output member marked + * `BinaryResponseBody()` receives the buffered bytes; sibling `Header()` + * members project response headers. Returns undefined when the output + * doesn't model a binary body (JSON ops fall through). + */ +const decodeBinaryBody = ({ + response, + outputAst, +}: { + readonly response: HttpClientResponse.HttpClientResponse; + readonly outputAst: AST.AST; +}): Effect.Effect | undefined => { + const props = getProps(outputAst); + const binary = props.find((p) => hasPropAnn(p, binaryResponseBodySymbol)); + if (binary === undefined) return undefined; + return Effect.gen(function* () { + const buffer = yield* response.arrayBuffer.pipe(Effect.orDie); + const result: Record = { + [String(binary.name)]: new Uint8Array(buffer), + }; + for (const prop of props) { + if (prop === binary) continue; + if (hasPropAnn(prop, headerSymbol)) { + const value = + response.headers[nameOf(prop, headerSymbol).toLowerCase()]; + if (value !== undefined) result[String(prop.name)] = value; + } + } + return result; + }); +}; + +/** + * The Blob data-plane protocol. Control ops ride the base endpoint; the + * content-read op carries `endpointHostPrefix: "{store}."` in its config + * (from the model's `smithy.api#endpoint` trait) and resolves to the + * per-store host — or the override's path form when `VERCEL_BLOB_API_URL` + * is set. The `{store}` placeholder is filled by the op's `HostLabel()` + * member (`{bareStoreIdLower}.{access}`). + */ +export const BlobDataProtocol: Layer.Layer = + makeRestProtocol({ + // Read per request so the emulator env injected before a call is seen. + credentials: Effect.sync(() => ({ + override: emptyToUndefined(process.env[BLOB_API_URL_ENV]), + })), + baseUrl: (creds, config) => { + const prefix = config?.endpointHostPrefix; + if (creds.override !== undefined) { + const base = stripTrailingSlash(creds.override); + return prefix === undefined + ? base + : `${base}/${prefix.replace(/\.$/, "")}`; + } + return prefix === undefined + ? DEFAULT_BLOB_API_URL + : `https://${prefix}blob.vercel-storage.com`; + }, + headers: () => ({ "x-api-version": BLOB_API_VERSION }), + mapMemberHeader: bearerPrefixAuthorization, + errorEnvelope, + statusMap, + unknownError, + decodeSuccess: decodeBinaryBody, + }); + +// ============================================================================= +// Queues data plane +// ============================================================================= + +/** + * Default Queues data-plane host template — `{region}` is filled per call + * from the op's `HostLabel()` member (e.g. `iad1`). + */ +export const DEFAULT_QUEUE_HOST_TEMPLATE = "https://{region}.vercel-queue.com"; + +/** + * Env var overriding the Queues data-plane HOST (local broker emulation — + * the same contract the official `vercel dev` uses). The `/api/v3/…` path + * prefix lives in the operation URIs and survives the override; the + * `region` member is ignored while the override is set. + */ +export const QUEUE_BASE_URL_ENV = "VERCEL_QUEUE_BASE_URL"; + +interface QueuesDataConfig { + readonly override: string | undefined; +} + +const CR = 13; +const LF = 10; +const DASH = 45; + +const textDecoder = new TextDecoder(); +const textEncoder = new TextEncoder(); + +const indexOfBytes = ( + haystack: Uint8Array, + needle: Uint8Array, + from: number, +): number => { + outer: for (let i = from; i <= haystack.length - needle.length; i++) { + for (let j = 0; j < needle.length; j++) { + if (haystack[i + j] !== needle[j]) continue outer; + } + return i; + } + return -1; +}; + +/** Extract the boundary parameter from a `multipart/mixed` content type. */ +export const parseMultipartBoundary = ( + contentType: string | undefined, +): string | undefined => { + if (contentType === undefined) return undefined; + const match = /boundary=(?:"([^"]+)"|([^;\s]+))/i.exec(contentType); + return match?.[1] ?? match?.[2]; +}; + +export interface MultipartPart { + readonly headers: Record; + readonly payload: Uint8Array; +} + +/** + * Parse a buffered `multipart/mixed` body into parts. Header names are + * lowercased; payload bytes are returned verbatim. + */ +export const parseMultipartMixed = ( + bytes: Uint8Array, + boundary: string, +): MultipartPart[] => { + const delimiter = textEncoder.encode(`--${boundary}`); + const partDelimiter = textEncoder.encode(`\r\n--${boundary}`); + const headerSeparator = textEncoder.encode("\r\n\r\n"); + const parts: MultipartPart[] = []; + + let index = indexOfBytes(bytes, delimiter, 0); + while (index !== -1) { + let cursor = index + delimiter.length; + // Closing delimiter: `--boundary--`. + if (bytes[cursor] === DASH && bytes[cursor + 1] === DASH) break; + // Skip the CRLF terminating the delimiter line. + if (bytes[cursor] === CR && bytes[cursor + 1] === LF) cursor += 2; + else if (bytes[cursor] === LF) cursor += 1; + + const nextDelimiter = indexOfBytes(bytes, partDelimiter, cursor); + const partEnd = nextDelimiter === -1 ? bytes.length : nextDelimiter; + + const separator = indexOfBytes(bytes, headerSeparator, cursor); + const headers: Record = {}; + let payload: Uint8Array; + if (separator !== -1 && separator < partEnd) { + const headerText = textDecoder.decode(bytes.subarray(cursor, separator)); + for (const line of headerText.split("\r\n")) { + const colon = line.indexOf(":"); + if (colon === -1) continue; + headers[line.slice(0, colon).trim().toLowerCase()] = line + .slice(colon + 1) + .trim(); + } + payload = bytes.subarray(separator + headerSeparator.length, partEnd); + } else { + payload = bytes.subarray(cursor, partEnd); + } + parts.push({ headers, payload }); + + if (nextDelimiter === -1) break; + index = nextDelimiter + 2; // reposition onto `--boundary` + } + return parts; +}; + +/** + * One multipart part → one message record matching the generated + * `QueueMessage` shape; undefined (part skipped, mirroring `@vercel/queue`) + * when required `Vqs-*` headers are missing — a skipped part stays leased + * and expires back onto the queue. + */ +const toMessageRecord = ( + part: MultipartPart, +): Record | undefined => { + const messageId = part.headers["vqs-message-id"]; + const createdAt = part.headers["vqs-timestamp"]; + const receiptHandle = part.headers["vqs-receipt-handle"]; + if ( + messageId === undefined || + createdAt === undefined || + receiptHandle === undefined + ) { + return undefined; + } + const deliveryCount = Number.parseInt( + part.headers["vqs-delivery-count"] ?? "0", + 10, + ); + if (Number.isNaN(deliveryCount)) return undefined; + return { + messageId, + deliveryCount, + createdAt, + expiresAt: part.headers["vqs-expires-at"], + contentType: part.headers["content-type"] ?? "application/octet-stream", + receiptHandle, + payload: part.payload.slice(), + }; +}; + +/** + * Decode a `multipart/mixed` receive: the output member marked + * `MultipartMessages()` receives one record per valid part; a 204 (nothing + * available) is an empty batch. Ops without that member (send/ack/extend) + * fall through to the JSON path. + */ +const decodeMultipartMessages = ({ + response, + outputAst, +}: { + readonly response: HttpClientResponse.HttpClientResponse; + readonly outputAst: AST.AST; +}): Effect.Effect | undefined => { + const props = getProps(outputAst); + const member = props.find((p) => hasPropAnn(p, multipartMessagesSymbol)); + if (member === undefined) return undefined; + const name = String(member.name); + return Effect.gen(function* () { + if (response.status === 204) { + yield* response.text.pipe(Effect.orDie); + return { [name]: [] }; + } + const boundary = parseMultipartBoundary(response.headers["content-type"]); + if (boundary === undefined) { + // A 2xx receive without a multipart body is protocol corruption, not + // an API failure — surface it as a defect. + const text = yield* response.text.pipe(Effect.orDie); + return yield* Effect.die( + new Error( + `expected a multipart/mixed response, got content-type ` + + `${JSON.stringify(response.headers["content-type"])}` + + (text ? `: ${text.slice(0, 200)}` : ""), + ), + ); + } + const buffer = yield* response.arrayBuffer.pipe(Effect.orDie); + const parts = parseMultipartMixed(new Uint8Array(buffer), boundary); + return { + [name]: parts.flatMap((part) => { + const message = toMessageRecord(part); + return message === undefined ? [] : [message]; + }), + }; + }); +}; + +/** + * The Queues data-plane protocol: per-region host template (env-overridable), + * per-call OIDC bearer, multipart/mixed receives parsed into typed message + * records. + */ +export const QueuesDataProtocol: Layer.Layer = + makeRestProtocol({ + credentials: Effect.sync(() => ({ + override: emptyToUndefined(process.env[QUEUE_BASE_URL_ENV]), + })), + baseUrl: (creds) => + creds.override !== undefined + ? stripTrailingSlash(creds.override) + : DEFAULT_QUEUE_HOST_TEMPLATE, + headers: () => ({}), + mapMemberHeader: bearerPrefixAuthorization, + errorEnvelope, + statusMap, + unknownError, + decodeSuccess: decodeMultipartMessages, + }); + +// ============================================================================= +// Edge Config data plane (read) +// ============================================================================= + +/** + * The live Edge Config read-plane origin. There is no env override — the + * endpoint is a PER-CALL `origin` member, because the connection string's + * origin is the override mechanism (local emulation hands out connection + * strings pointing at `http://localhost:`). + */ +export const DEFAULT_EDGE_CONFIG_API_URL = "https://edge-config.vercel.com"; + +/** + * The Edge Config read-plane protocol. Every op's base URL is its `origin` + * HostLabel member verbatim; auth is the read token (bearer). The + * missing-item vs missing-config 404 distinction rides the typed error + * matchers (`x-edge-config-digest` header presence). + */ +export const EdgeConfigDataProtocol: Layer.Layer = + makeRestProtocol>({ + credentials: Effect.succeed({}), + baseUrl: () => "{origin}", + headers: () => ({}), + mapMemberHeader: bearerPrefixAuthorization, + errorEnvelope, + statusMap, + unknownError, + }); diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index 6f2be12e0..631135e9d 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -14,5 +14,6 @@ export { type VercelOpError, type VercelOpContext, } from "./protocol.ts"; +export * from "./data-protocol.ts"; export * as Retry from "./retry.ts"; export * as Services from "./services/index.ts"; diff --git a/packages/vercel/src/protocol.ts b/packages/vercel/src/protocol.ts index b191f6089..649853df3 100644 --- a/packages/vercel/src/protocol.ts +++ b/packages/vercel/src/protocol.ts @@ -61,6 +61,18 @@ const errorEnvelope = (body: unknown): RestErrorEnvelope | undefined => { }; }; +// The DATA-PLANE protocols (blob_data / queues_data / edge_config_data — +// generated from manual-specs) are re-exported here because the generated +// service headers import their protocol + op error/context types from +// `../protocol.ts`. +export { + BlobDataProtocol, + QueuesDataProtocol, + EdgeConfigDataProtocol, + type VercelDataOpError, + type VercelDataOpContext, +} from "./data-protocol.ts"; + export const VercelProtocol: Layer.Layer = makeRestProtocol({ // Resolved on the CALLING fiber per request (the layer is memoized per diff --git a/packages/vercel/src/services/access_groups.ts b/packages/vercel/src/services/access_groups.ts index d69ed5679..5f656a094 100644 --- a/packages/vercel/src/services/access_groups.ts +++ b/packages/vercel/src/services/access_groups.ts @@ -30,6 +30,15 @@ export class Forbidden [{ status: 403 }], ) {} +export class NotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("NotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + /** The project role that will be added to this Access Group. "null" will remove this project level role. */ export type CreateAccessGroupRequestProjectsItemRole = | "ADMIN" @@ -506,47 +515,46 @@ export const ListAccessGroupsRequest = /*@__PURE__*/ S.suspend(() => identifier: "ListAccessGroupsRequest", }) as any as S.Schema; -export type ListAccessGroupsResponseBodyCase1AccessGroupsItemMembersList = - Array; -export const ListAccessGroupsResponseBodyCase1AccessGroupsItemMembersList = +export type ListAccessGroupsResponseAccessGroupsItemMembersList = Array; +export const ListAccessGroupsResponseAccessGroupsItemMembersList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type ListAccessGroupsResponseBodyCase1AccessGroupsItemProjectsList = +export type ListAccessGroupsResponseAccessGroupsItemProjectsList = Array; -export const ListAccessGroupsResponseBodyCase1AccessGroupsItemProjectsList = +export const ListAccessGroupsResponseAccessGroupsItemProjectsList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type ListAccessGroupsResponseBodyCase1AccessGroupsItemEntitlementsList = +export type ListAccessGroupsResponseAccessGroupsItemEntitlementsList = Array; -export const ListAccessGroupsResponseBodyCase1AccessGroupsItemEntitlementsList = +export const ListAccessGroupsResponseAccessGroupsItemEntitlementsList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamPermissionsList = +export type ListAccessGroupsResponseAccessGroupsItemTeamPermissionsList = Array; -export const ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamPermissionsList = +export const ListAccessGroupsResponseAccessGroupsItemTeamPermissionsList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; /** Roles that the team has in the access group. */ -export type ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamRolesList = +export type ListAccessGroupsResponseAccessGroupsItemTeamRolesList = Array; -export const ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamRolesList = +export const ListAccessGroupsResponseAccessGroupsItemTeamRolesList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface ListAccessGroupsResponseBodyCase1AccessGroupsItem { - members?: ListAccessGroupsResponseBodyCase1AccessGroupsItemMembersList; - projects?: ListAccessGroupsResponseBodyCase1AccessGroupsItemProjectsList; - entitlements?: ListAccessGroupsResponseBodyCase1AccessGroupsItemEntitlementsList; - teamPermissions?: ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamPermissionsList; +export interface ListAccessGroupsResponseAccessGroupsItem { + members?: ListAccessGroupsResponseAccessGroupsItemMembersList; + projects?: ListAccessGroupsResponseAccessGroupsItemProjectsList; + entitlements?: ListAccessGroupsResponseAccessGroupsItemEntitlementsList; + teamPermissions?: ListAccessGroupsResponseAccessGroupsItemTeamPermissionsList; isDsyncManaged: boolean; /** The name of this access group. */ name: string; @@ -563,22 +571,20 @@ export interface ListAccessGroupsResponseBodyCase1AccessGroupsItem { /** Number of projects in the access group. */ projectsCount: number; /** Roles that the team has in the access group. */ - teamRoles?: ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamRolesList; + teamRoles?: ListAccessGroupsResponseAccessGroupsItemTeamRolesList; } -export const ListAccessGroupsResponseBodyCase1AccessGroupsItem = - /*@__PURE__*/ S.suspend(() => +export const ListAccessGroupsResponseAccessGroupsItem = /*@__PURE__*/ S.suspend( + () => S.Struct({ - members: S.optional( - ListAccessGroupsResponseBodyCase1AccessGroupsItemMembersList, - ), + members: S.optional(ListAccessGroupsResponseAccessGroupsItemMembersList), projects: S.optional( - ListAccessGroupsResponseBodyCase1AccessGroupsItemProjectsList, + ListAccessGroupsResponseAccessGroupsItemProjectsList, ), entitlements: S.optional( - ListAccessGroupsResponseBodyCase1AccessGroupsItemEntitlementsList, + ListAccessGroupsResponseAccessGroupsItemEntitlementsList, ), teamPermissions: S.optional( - ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamPermissionsList, + ListAccessGroupsResponseAccessGroupsItemTeamPermissionsList, ), isDsyncManaged: S.Boolean, name: S.String, @@ -589,47 +595,33 @@ export const ListAccessGroupsResponseBodyCase1AccessGroupsItem = membersCount: S.Number, projectsCount: S.Number, teamRoles: S.optional( - ListAccessGroupsResponseBodyCase1AccessGroupsItemTeamRolesList, + ListAccessGroupsResponseAccessGroupsItemTeamRolesList, ), }), - ).annotate({ - identifier: "ListAccessGroupsResponseBodyCase1AccessGroupsItem", - }) as any as S.Schema; +).annotate({ + identifier: "ListAccessGroupsResponseAccessGroupsItem", +}) as any as S.Schema; -export type ListAccessGroupsResponseBodyCase1AccessGroupsList = - Array; -export const ListAccessGroupsResponseBodyCase1AccessGroupsList = - /*@__PURE__*/ S.Array( - ListAccessGroupsResponseBodyCase1AccessGroupsItem, - ) as any as S.Schema; +export type ListAccessGroupsResponseAccessGroupsList = + Array; +export const ListAccessGroupsResponseAccessGroupsList = /*@__PURE__*/ S.Array( + ListAccessGroupsResponseAccessGroupsItem, +) as any as S.Schema; -export type ListAccessGroupsResponseBodyCase1Pagination = +export type ListAccessGroupsResponsePagination = ListAccessGroupMembersResponsePagination; -export const ListAccessGroupsResponseBodyCase1Pagination = +export const ListAccessGroupsResponsePagination = ListAccessGroupMembersResponsePagination; -export interface ListAccessGroupsResponseBodyCase1 { - accessGroups: ListAccessGroupsResponseBodyCase1AccessGroupsList; +export interface ListAccessGroupsResponse { + accessGroups: ListAccessGroupsResponseAccessGroupsList; pagination: ListAccessGroupMembersResponsePagination; } -export const ListAccessGroupsResponseBodyCase1 = /*@__PURE__*/ S.suspend(() => +export const ListAccessGroupsResponse = /*@__PURE__*/ S.suspend(() => S.Struct({ - accessGroups: ListAccessGroupsResponseBodyCase1AccessGroupsList, + accessGroups: ListAccessGroupsResponseAccessGroupsList, pagination: ListAccessGroupMembersResponsePagination, }), -).annotate({ - identifier: "ListAccessGroupsResponseBodyCase1", -}) as any as S.Schema; - -export type ListAccessGroupsResponseBody = - | unknown - | ListAccessGroupsResponseBodyCase1; -export const ListAccessGroupsResponseBody = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type ListAccessGroupsResponse = ListAccessGroupsResponseBody; -export const ListAccessGroupsResponse = /*@__PURE__*/ S.suspend(() => - ListAccessGroupsResponseBody.pipe(T.RawResponseRoot()), ).annotate({ identifier: "ListAccessGroupsResponse", }) as any as S.Schema; @@ -1014,7 +1006,11 @@ export const createAccessGroupProject: API.OperationMethod< retry: Retry.Retry, })); -export type DeleteAccessGroupError = BadRequest | Forbidden | VercelOpError; +export type DeleteAccessGroupError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Deletes an access group Allows to delete an access group */ export const deleteAccessGroup: API.OperationMethod< DeleteAccessGroupRequest, @@ -1024,7 +1020,7 @@ export const deleteAccessGroup: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: DeleteAccessGroupRequest, output: DeleteAccessGroupResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -1032,6 +1028,7 @@ export const deleteAccessGroup: API.OperationMethod< export type DeleteAccessGroupProjectError = | BadRequest | Forbidden + | NotFound | VercelOpError; /** Delete an access group project Allows deletion of an access group project */ export const deleteAccessGroupProject: API.OperationMethod< @@ -1042,7 +1039,7 @@ export const deleteAccessGroupProject: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: DeleteAccessGroupProjectRequest, output: DeleteAccessGroupProjectResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -1098,7 +1095,11 @@ export const listAccessGroups: API.OperationMethod< retry: Retry.Retry, })); -export type ReadAccessGroupError = BadRequest | Forbidden | VercelOpError; +export type ReadAccessGroupError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Reads an access group Allows to read an access group */ export const readAccessGroup: API.OperationMethod< ReadAccessGroupRequest, @@ -1108,7 +1109,7 @@ export const readAccessGroup: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: ReadAccessGroupRequest, output: ReadAccessGroupResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -1116,6 +1117,7 @@ export const readAccessGroup: API.OperationMethod< export type ReadAccessGroupProjectError = | BadRequest | Forbidden + | NotFound | VercelOpError; /** Reads an access group project Allows reading an access group project */ export const readAccessGroupProject: API.OperationMethod< @@ -1126,7 +1128,7 @@ export const readAccessGroupProject: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: ReadAccessGroupProjectRequest, output: ReadAccessGroupProjectResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/ai_gateway.ts b/packages/vercel/src/services/ai_gateway.ts index 3cc80141e..6f0a65412 100644 --- a/packages/vercel/src/services/ai_gateway.ts +++ b/packages/vercel/src/services/ai_gateway.ts @@ -237,7 +237,11 @@ export const deleteAiGatewayRule: API.OperationMethod< retry: Retry.Retry, })); -export type ListAiGatewayRulesError = BadRequest | Forbidden | VercelOpError; +export type ListAiGatewayRulesError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** List rules List the authenticated team's routing rules */ export const listAiGatewayRules: API.OperationMethod< ListAiGatewayRulesRequest, @@ -247,7 +251,7 @@ export const listAiGatewayRules: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: ListAiGatewayRulesRequest, output: AiGatewayRuleList, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/artifacts.ts b/packages/vercel/src/services/artifacts.ts index 6f0fbf82b..9c8337607 100644 --- a/packages/vercel/src/services/artifacts.ts +++ b/packages/vercel/src/services/artifacts.ts @@ -366,6 +366,7 @@ export interface UploadArtifactRequest { xArtifactSha?: string; /** A hash representing uncommitted changes in the working directory when this artifact was generated. */ xArtifactDirtyHash?: string; + body: Blob | Uint8Array | ArrayBuffer | string; } export const UploadArtifactRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ @@ -387,7 +388,15 @@ export const UploadArtifactRequest = /*@__PURE__*/ S.suspend(() => xArtifactDirtyHash: S.optional( S.String.pipe(T.Header("x-Artifact-Dirty-Hash")), ), - }).pipe(T.Http({ method: "PUT", uri: "/v8/artifacts/{hash}", code: 200 })), + body: S.String.pipe(T.HttpBody()), + }).pipe( + T.Http({ + method: "PUT", + uri: "/v8/artifacts/{hash}", + code: 200, + bodyMediaType: "application/octet-stream", + }), + ), ).annotate({ identifier: "UploadArtifactRequest", }) as any as S.Schema; diff --git a/packages/vercel/src/services/blob_data.ts b/packages/vercel/src/services/blob_data.ts new file mode 100644 index 000000000..577d10e2b --- /dev/null +++ b/packages/vercel/src/services/blob_data.ts @@ -0,0 +1,432 @@ +// AUTO-GENERATED by scripts/generate.ts from manual-specs (hand-authored data-plane models). Do not edit. +import * as S from "@distilled.cloud/core/schema"; +import * as Redacted from "effect/Redacted"; +import * as API from "@distilled.cloud/core/api"; +import * as C from "@distilled.cloud/core/category"; +import * as T from "../traits.ts"; +import { + BlobDataProtocol, + type VercelDataOpError, + type VercelDataOpContext, +} from "../protocol.ts"; +import * as Retry from "../retry.ts"; + +export type { VercelDataOpError, VercelDataOpContext }; + +/** 400 "This blob already exists…" — a conditional create (`x-allow-overwrite: 0`, or the header absent: the wire default REFUSES overwrites) hit an existing pathname. */ +export class BlobAlreadyExists + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("BlobAlreadyExists", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 400, message: { includes: "already exists" } }], + ) {} + +/** Any other 400 from the data plane (e.g. access-mode mismatch on a put). */ +export class BlobBadRequest + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("BlobBadRequest", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 400 }], + ) {} + +/** 403 — the token is not allowed to perform the operation (or an unauthenticated private read). */ +export class BlobForbidden + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("BlobForbidden", { + code: S.Number, + message: S.String, + }).pipe(C.withAuthError), + [{ status: 403 }], + ) {} + +/** 404 `not_found` — the blob does not exist. */ +export class BlobNotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("BlobNotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + +/** 412 `precondition_failed` — the `x-if-match` etag no longer matches (CAS). */ +export class BlobPreconditionFailed + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()( + "BlobPreconditionFailed", + { + code: S.Number, + message: S.String, + }, + ), + [{ status: 412 }], + ) {} + +/** 401 — the data-plane token was rejected. */ +export class BlobUnauthorized + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("BlobUnauthorized", { + code: S.Number, + message: S.String, + }).pipe(C.withAuthError), + [{ status: 401 }], + ) {} + +export type UrlList = Array; +export const UrlList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface DeleteBlobsRequest { + /** The store's RW token — sent as the bearer. */ + token: string | Redacted.Redacted; + /** CANONICAL blob urls to delete (idempotent — missing blobs are not an error). */ + urls: UrlList; +} +export const DeleteBlobsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + urls: UrlList, + }).pipe(T.Http({ method: "POST", uri: "/delete", code: 200 })), +).annotate({ + identifier: "DeleteBlobsRequest", +}) as any as S.Schema; + +/** The wire answers `200 null`; there is no payload. */ +export interface DeleteBlobsResponse {} +export const DeleteBlobsResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteBlobsResponse", +}) as any as S.Schema; + +export interface GetBlobContentRequest { + /** The store's content-host handle: `{bareStoreIdLower}.{access}` (store id minus `store_`, lowercased, dot, access mode). Fills the `{store}` endpoint label — live: `https://{store}.blob.vercel-storage.com`; under a VERCEL_BLOB_API_URL override: `{override}/{store}`. */ + store: string; + /** The store's RW token — required for private stores, harmless for public ones. */ + token: string | Redacted.Redacted; + /** Pathname of the blob within the store (may contain `/` — encoded per segment). */ + pathname: string; +} +export const GetBlobContentRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + store: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + pathname: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/{pathname+}", code: 200 })), +).annotate({ + identifier: "GetBlobContentRequest", +}) as any as S.Schema; + +export interface GetBlobContentResponse { + /** The blob's content, buffered. */ + body: Uint8Array; + /** Content type served with the blob. */ + contentType?: string; + /** Quoted entity tag served with the content. */ + etag?: string; +} +export const GetBlobContentResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + body: S.String.pipe(T.BinaryResponseBody()), + contentType: S.optional(S.String.pipe(T.Header("content-type"))), + etag: S.optional(S.String.pipe(T.Header())), + }), +).annotate({ + identifier: "GetBlobContentResponse", +}) as any as S.Schema; + +export interface HeadBlobRequest { + /** The store's RW token — sent as the bearer. */ + token: string | Redacted.Redacted; + /** The blob's CANONICAL url (`https://{storeIdLower}.{access}.blob.vercel-storage.com/{pathname}`) — `?url=` is what makes this a head; `?pathname=` on GET is a prefix LIST. */ + url: string; +} +export const HeadBlobRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + url: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/", code: 200 })), +).annotate({ + identifier: "HeadBlobRequest", +}) as any as S.Schema; + +export interface HeadBlobResponse { + /** Canonical blob URL. */ + url: string; + /** The blob URL with `?download=1`. */ + downloadUrl: string; + /** Pathname of the blob within the store. */ + pathname: string; + /** Content type recorded at upload. */ + contentType?: string; + /** Content disposition served with the blob. */ + contentDisposition?: string; + /** Size in bytes. */ + size: number; + /** Upload timestamp (ISO 8601). */ + uploadedAt: string; + /** Cache-control policy served with the blob. */ + cacheControl?: string; + /** Quoted entity tag — pass to `ifMatch` for CAS. */ + etag: string; +} +export const HeadBlobResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + url: S.String, + downloadUrl: S.String, + pathname: S.String, + contentType: S.optional(S.String), + contentDisposition: S.optional(S.String), + size: S.Number, + uploadedAt: S.String, + cacheControl: S.optional(S.String), + etag: S.String, + }), +).annotate({ + identifier: "HeadBlobResponse", +}) as any as S.Schema; + +export interface ListBlobsRequest { + /** The store's RW token — sent as the bearer. */ + token: string | Redacted.Redacted; + /** Only list blobs whose pathname starts with this prefix. */ + prefix?: string; + /** Page size. */ + limit?: number; + /** Continuation cursor from a previous page. */ + cursor?: string; +} +export const ListBlobsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + prefix: S.optional(S.String.pipe(T.Query())), + limit: S.optional(S.Number.pipe(T.Query())), + cursor: S.optional(S.String.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/", code: 200 })), +).annotate({ + identifier: "ListBlobsRequest", +}) as any as S.Schema; + +/** Metadata row returned by list — list rows carry no content type/disposition. */ +export interface BlobListItem { + /** Canonical blob URL. */ + url: string; + /** The blob URL with `?download=1`. */ + downloadUrl: string; + /** Pathname of the blob within the store. */ + pathname: string; + /** Size in bytes. */ + size: number; + /** Upload timestamp (ISO 8601). */ + uploadedAt: string; + /** Quoted entity tag — pass to `ifMatch` for CAS. */ + etag: string; +} +export const BlobListItem = /*@__PURE__*/ S.suspend(() => + S.Struct({ + url: S.String, + downloadUrl: S.String, + pathname: S.String, + size: S.Number, + uploadedAt: S.String, + etag: S.String, + }), +).annotate({ identifier: "BlobListItem" }) as any as S.Schema; + +export type BlobListItemList = Array; +export const BlobListItemList = /*@__PURE__*/ S.Array( + BlobListItem, +) as any as S.Schema; + +export interface ListBlobsResponse { + /** Whether another page exists. */ + hasMore: boolean; + /** Cursor for the next page (present when `hasMore`). */ + cursor?: string; + /** One page of blobs. */ + blobs: BlobListItemList; +} +export const ListBlobsResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hasMore: S.Boolean, + cursor: S.optional(S.String), + blobs: BlobListItemList, + }), +).annotate({ + identifier: "ListBlobsResponse", +}) as any as S.Schema; + +/** The store's access mode — must match the store (a private store rejects `public` and missing alike). */ +export type BlobAccess = "public" | "private"; +export const BlobAccess = /*@__PURE__*/ S.String; + +/** `x-allow-overwrite` wire values: `1` overwrites, `0` is a conditional create (typed BlobAlreadyExists on an existing pathname). The wire DEFAULT with the header absent is to refuse overwrites — send it explicitly. */ +export type BlobAllowOverwrite = "0" | "1"; +export const BlobAllowOverwrite = /*@__PURE__*/ S.String; + +export interface PutBlobRequest { + /** The store's RW token (`vercel_blob_rw_…`) — sent as the bearer. */ + token: string | Redacted.Redacted; + /** Pathname of the blob within the store (query parameter, NOT the path). */ + pathname: string; + /** The store's access mode. */ + access: BlobAccess | (string & {}); + /** Content type stored and served with the blob. */ + contentType?: string; + /** Compare-and-swap: only write if the blob's current quoted etag matches (412 BlobPreconditionFailed otherwise). */ + ifMatch?: string; + /** `1` to overwrite, `0` for a conditional create. The wire default (header absent) REFUSES overwrites. */ + allowOverwrite?: BlobAllowOverwrite | (string & {}); + /** The blob content — sent verbatim as the request body. */ + body: Blob | Uint8Array | ArrayBuffer | string; +} +export const PutBlobRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + pathname: S.String.pipe(T.Query()), + access: BlobAccess.pipe(T.Header("x-vercel-blob-access")), + contentType: S.optional(S.String.pipe(T.Header("content-type"))), + ifMatch: S.optional(S.String.pipe(T.Header("x-if-match"))), + allowOverwrite: S.optional( + BlobAllowOverwrite.pipe(T.Header("x-allow-overwrite")), + ), + body: S.String.pipe(T.HttpBody()), + }).pipe(T.Http({ method: "PUT", uri: "/", code: 200 })), +).annotate({ identifier: "PutBlobRequest" }) as any as S.Schema; + +export interface PutBlobResponse { + /** Canonical blob URL (`https://{storeIdLower}.{access}.blob.vercel-storage.com/{pathname}`). */ + url: string; + /** The blob URL with `?download=1` (forces attachment disposition). */ + downloadUrl: string; + /** Pathname of the blob within the store. */ + pathname: string; + /** Content type recorded at upload. */ + contentType?: string; + /** Content disposition served with the blob. */ + contentDisposition?: string; + /** Quoted entity tag of the NEW content — the CAS handle for the next write. */ + etag: string; +} +export const PutBlobResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + url: S.String, + downloadUrl: S.String, + pathname: S.String, + contentType: S.optional(S.String), + contentDisposition: S.optional(S.String), + etag: S.String, + }), +).annotate({ + identifier: "PutBlobResponse", +}) as any as S.Schema; + +export type DeleteBlobsError = + | BlobBadRequest + | BlobUnauthorized + | BlobForbidden + | VercelDataOpError; +/** Idempotent batch delete by canonical URL: `POST {endpoint}/delete` `{urls: […]}`. */ +export const deleteBlobs: API.OperationMethod< + DeleteBlobsRequest, + DeleteBlobsResponse, + DeleteBlobsError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteBlobsRequest, + output: DeleteBlobsResponse, + errors: [BlobBadRequest, BlobUnauthorized, BlobForbidden], + protocol: BlobDataProtocol, + retry: Retry.Retry, +})); + +export type GetBlobContentError = + | BlobNotFound + | BlobUnauthorized + | BlobForbidden + | VercelDataOpError; +/** Fetch a blob's content from its per-store host (`https://{store}.blob.vercel-storage.com/{pathname}`; under a VERCEL_BLOB_API_URL override: `{override}/{store}/{pathname}`). */ +export const getBlobContent: API.OperationMethod< + GetBlobContentRequest, + GetBlobContentResponse, + GetBlobContentError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetBlobContentRequest, + output: GetBlobContentResponse, + errors: [BlobNotFound, BlobUnauthorized, BlobForbidden], + protocol: BlobDataProtocol, + retry: Retry.Retry, + endpointHostPrefix: "{store}.", +})); + +export type HeadBlobError = + | BlobNotFound + | BlobBadRequest + | BlobUnauthorized + | BlobForbidden + | VercelDataOpError; +/** Blob metadata: `GET {endpoint}/?url=` → metadata JSON, 404 BlobNotFound when the blob does not exist. */ +export const headBlob: API.OperationMethod< + HeadBlobRequest, + HeadBlobResponse, + HeadBlobError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: HeadBlobRequest, + output: HeadBlobResponse, + errors: [BlobNotFound, BlobBadRequest, BlobUnauthorized, BlobForbidden], + protocol: BlobDataProtocol, + retry: Retry.Retry, +})); + +export type ListBlobsError = + | BlobBadRequest + | BlobUnauthorized + | BlobForbidden + | VercelDataOpError; +/** One page of blobs: `GET {endpoint}/?prefix=&limit=&cursor=`. Callers advance `cursor` while `hasMore`. */ +export const listBlobs: API.OperationMethod< + ListBlobsRequest, + ListBlobsResponse, + ListBlobsError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ListBlobsRequest, + output: ListBlobsResponse, + errors: [BlobBadRequest, BlobUnauthorized, BlobForbidden], + protocol: BlobDataProtocol, + retry: Retry.Retry, +})); + +export type PutBlobError = + | BlobAlreadyExists + | BlobPreconditionFailed + | BlobBadRequest + | BlobUnauthorized + | BlobForbidden + | VercelDataOpError; +/** Upload a blob: `PUT {endpoint}/?pathname=…` with the content as the raw body. Every put returns the new content's etag. */ +export const putBlob: API.OperationMethod< + PutBlobRequest, + PutBlobResponse, + PutBlobError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: PutBlobRequest, + output: PutBlobResponse, + errors: [ + BlobAlreadyExists, + BlobPreconditionFailed, + BlobBadRequest, + BlobUnauthorized, + BlobForbidden, + ], + protocol: BlobDataProtocol, + retry: Retry.Retry, +})); diff --git a/packages/vercel/src/services/bulk_redirects.ts b/packages/vercel/src/services/bulk_redirects.ts index d9d5f4f0a..a7e2a3b81 100644 --- a/packages/vercel/src/services/bulk_redirects.ts +++ b/packages/vercel/src/services/bulk_redirects.ts @@ -276,20 +276,12 @@ export const GetRedirectsRequest = /*@__PURE__*/ S.suspend(() => identifier: "GetRedirectsRequest", }) as any as S.Schema; -export type GetRedirectsResponseBodyCase0Map = { - [key: string]: unknown | undefined; -}; -export const GetRedirectsResponseBodyCase0Map = /*@__PURE__*/ S.Record( - S.String, - S.Unknown, -) as any as S.Schema; - -export type GetRedirectsResponseBodyCase1Version = +export type GetRedirectsResponseVersion = DeleteRedirectsResponseBodyCase0Version; -export const GetRedirectsResponseBodyCase1Version = +export const GetRedirectsResponseVersion = DeleteRedirectsResponseBodyCase0Version; -export interface GetRedirectsResponseBodyCase1RedirectsItem { +export interface GetRedirectsResponseRedirectsItem { statusCode?: number; permanent?: boolean; sensitive?: boolean; @@ -299,105 +291,53 @@ export interface GetRedirectsResponseBodyCase1RedirectsItem { destination: string; source: string; } -export const GetRedirectsResponseBodyCase1RedirectsItem = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - statusCode: S.optional(S.Number), - permanent: S.optional(S.Boolean), - sensitive: S.optional(S.Boolean), - caseSensitive: S.optional(S.Boolean), - query: S.optional(S.Boolean), - preserveQueryParams: S.optional(S.Boolean), - destination: S.String, - source: S.String, - }), - ).annotate({ - identifier: "GetRedirectsResponseBodyCase1RedirectsItem", - }) as any as S.Schema; +export const GetRedirectsResponseRedirectsItem = /*@__PURE__*/ S.suspend(() => + S.Struct({ + statusCode: S.optional(S.Number), + permanent: S.optional(S.Boolean), + sensitive: S.optional(S.Boolean), + caseSensitive: S.optional(S.Boolean), + query: S.optional(S.Boolean), + preserveQueryParams: S.optional(S.Boolean), + destination: S.String, + source: S.String, + }), +).annotate({ + identifier: "GetRedirectsResponseRedirectsItem", +}) as any as S.Schema; -export type GetRedirectsResponseBodyCase1RedirectsList = - Array; -export const GetRedirectsResponseBodyCase1RedirectsList = /*@__PURE__*/ S.Array( - GetRedirectsResponseBodyCase1RedirectsItem, -) as any as S.Schema; +export type GetRedirectsResponseRedirectsList = + Array; +export const GetRedirectsResponseRedirectsList = /*@__PURE__*/ S.Array( + GetRedirectsResponseRedirectsItem, +) as any as S.Schema; -export interface GetRedirectsResponseBodyCase1Pagination { +export interface GetRedirectsResponsePagination { page: number; per_page: number; numPages: number; } -export const GetRedirectsResponseBodyCase1Pagination = /*@__PURE__*/ S.suspend( - () => - S.Struct({ - page: S.Number, - per_page: S.Number, - numPages: S.Number, - }), -).annotate({ - identifier: "GetRedirectsResponseBodyCase1Pagination", -}) as any as S.Schema; - -export interface GetRedirectsResponseBodyCase1 { - version: DeleteRedirectsResponseBodyCase0Version; - redirects: GetRedirectsResponseBodyCase1RedirectsList; - pagination: GetRedirectsResponseBodyCase1Pagination; -} -export const GetRedirectsResponseBodyCase1 = /*@__PURE__*/ S.suspend(() => +export const GetRedirectsResponsePagination = /*@__PURE__*/ S.suspend(() => S.Struct({ - version: DeleteRedirectsResponseBodyCase0Version, - redirects: GetRedirectsResponseBodyCase1RedirectsList, - pagination: GetRedirectsResponseBodyCase1Pagination, + page: S.Number, + per_page: S.Number, + numPages: S.Number, }), ).annotate({ - identifier: "GetRedirectsResponseBodyCase1", -}) as any as S.Schema; - -export type GetRedirectsResponseBodyCase2RedirectsItem = - GetRedirectsResponseBodyCase1RedirectsItem; -export const GetRedirectsResponseBodyCase2RedirectsItem = - GetRedirectsResponseBodyCase1RedirectsItem; + identifier: "GetRedirectsResponsePagination", +}) as any as S.Schema; -export type GetRedirectsResponseBodyCase2RedirectsList = - Array; -export const GetRedirectsResponseBodyCase2RedirectsList = /*@__PURE__*/ S.Array( - GetRedirectsResponseBodyCase1RedirectsItem, -) as any as S.Schema; - -export type GetRedirectsResponseBodyCase2Version = - DeleteRedirectsResponseBodyCase0Version; -export const GetRedirectsResponseBodyCase2Version = - DeleteRedirectsResponseBodyCase0Version; - -export type GetRedirectsResponseBodyCase2Pagination = - GetRedirectsResponseBodyCase1Pagination; -export const GetRedirectsResponseBodyCase2Pagination = - GetRedirectsResponseBodyCase1Pagination; - -export interface GetRedirectsResponseBodyCase2 { - redirects: GetRedirectsResponseBodyCase2RedirectsList; - version?: DeleteRedirectsResponseBodyCase0Version; - pagination: GetRedirectsResponseBodyCase1Pagination; +export interface GetRedirectsResponse { + version?: DeleteRedirectsResponseBodyCase0Version | null; + redirects: GetRedirectsResponseRedirectsList; + pagination?: GetRedirectsResponsePagination; } -export const GetRedirectsResponseBodyCase2 = /*@__PURE__*/ S.suspend(() => +export const GetRedirectsResponse = /*@__PURE__*/ S.suspend(() => S.Struct({ - redirects: GetRedirectsResponseBodyCase2RedirectsList, - version: S.optional(DeleteRedirectsResponseBodyCase0Version), - pagination: GetRedirectsResponseBodyCase1Pagination, + version: S.optional(S.NullOr(DeleteRedirectsResponseBodyCase0Version)), + redirects: GetRedirectsResponseRedirectsList, + pagination: S.optional(GetRedirectsResponsePagination), }), -).annotate({ - identifier: "GetRedirectsResponseBodyCase2", -}) as any as S.Schema; - -export type GetRedirectsResponseBody = - | GetRedirectsResponseBodyCase0Map - | GetRedirectsResponseBodyCase1 - | GetRedirectsResponseBodyCase2; -export const GetRedirectsResponseBody = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRedirectsResponse = GetRedirectsResponseBody; -export const GetRedirectsResponse = /*@__PURE__*/ S.suspend(() => - GetRedirectsResponseBody.pipe(T.RawResponseRoot()), ).annotate({ identifier: "GetRedirectsResponse", }) as any as S.Schema; @@ -538,20 +478,19 @@ export const StageRedirectsRequestRedirectsList = /*@__PURE__*/ S.Array( ) as any as S.Schema; export interface StageRedirectsRequest { - /** The Team identifier to perform the request on behalf of. */ - teamId?: string; /** The Team slug to perform the request on behalf of. */ slug?: string; projectId: string; + teamId: string; overwrite?: boolean; name?: string; redirects?: StageRedirectsRequestRedirectsList; } export const StageRedirectsRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ - teamId: S.optional(S.String.pipe(T.Query())), slug: S.optional(S.String.pipe(T.Query())), projectId: S.String, + teamId: S.String, overwrite: S.optional(S.Boolean), name: S.optional(S.String), redirects: S.optional(StageRedirectsRequestRedirectsList), @@ -679,7 +618,11 @@ export const getRedirects: API.OperationMethod< retry: Retry.Retry, })); -export type GetVersionsError = BadRequest | Forbidden | VercelOpError; +export type GetVersionsError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Get the version history for a project's redirects. Get the version history for a project's bulk redirects */ export const getVersions: API.OperationMethod< GetVersionsRequest, @@ -689,7 +632,7 @@ export const getVersions: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetVersionsRequest, output: GetVersionsResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -713,7 +656,11 @@ export const restoreRedirects: API.OperationMethod< retry: Retry.Retry, })); -export type StageRedirectsError = BadRequest | Forbidden | VercelOpError; +export type StageRedirectsError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Stages new redirects for a project. Stages new redirects for a project and returns the new version. */ export const stageRedirects: API.OperationMethod< StageRedirectsRequest, @@ -723,7 +670,7 @@ export const stageRedirects: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: StageRedirectsRequest, output: StageRedirectsResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/certs.ts b/packages/vercel/src/services/certs.ts index 1d56472fb..8e77337db 100644 --- a/packages/vercel/src/services/certs.ts +++ b/packages/vercel/src/services/certs.ts @@ -21,6 +21,15 @@ export class BadRequest [{ status: 400 }], ) {} +export class DomainPretestFailed + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("DomainPretestFailed", { + code: S.Number, + message: S.String, + }), + [{ status: 449 }], + ) {} + export class Forbidden extends /*@__PURE__*/ T.applyErrorMatchers( /*@__PURE__*/ S.TaggedError()("Forbidden", { @@ -327,6 +336,7 @@ export type IssueCertError = | PaymentRequired | Forbidden | NotFound + | DomainPretestFailed | VercelOpError; /** Issue a new cert Issue a new cert */ export const issueCert: API.OperationMethod< @@ -337,7 +347,13 @@ export const issueCert: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: IssueCertRequest, output: IssueCertResponse, - errors: [BadRequest, PaymentRequired, Forbidden, NotFound], + errors: [ + BadRequest, + PaymentRequired, + Forbidden, + NotFound, + DomainPretestFailed, + ], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/checks_v2.ts b/packages/vercel/src/services/checks_v2.ts index 837100f76..0836c8b4f 100644 --- a/packages/vercel/src/services/checks_v2.ts +++ b/packages/vercel/src/services/checks_v2.ts @@ -3035,7 +3035,11 @@ export const getDeploymentCheckRun: API.OperationMethod< retry: Retry.Retry, })); -export type GetProjectCheckError = BadRequest | Forbidden | VercelOpError; +export type GetProjectCheckError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Get a check Return a detailed response for a single check. */ export const getProjectCheck: API.OperationMethod< GetProjectCheckRequest, @@ -3045,7 +3049,7 @@ export const getProjectCheck: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetProjectCheckRequest, output: GetProjectCheckResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/deployments.ts b/packages/vercel/src/services/deployments.ts index db11f16ad..98f2890e6 100644 --- a/packages/vercel/src/services/deployments.ts +++ b/packages/vercel/src/services/deployments.ts @@ -14103,7 +14103,8 @@ export type GetDeploymentResponseBodyCase0ReadyState = | "ERROR" | "INITIALIZING" | "QUEUED" - | "READY"; + | "READY" + | "DELETED"; export const GetDeploymentResponseBodyCase0ReadyState = /*@__PURE__*/ S.String; /** An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` */ @@ -14117,6 +14118,13 @@ export type GetDeploymentResponseBodyCase0AliasWarning = export const GetDeploymentResponseBodyCase0AliasWarning = CancelDeploymentResponseAliasWarning; +export type GetDeploymentResponseBodyCase0ReadySubstate = + | "PROMOTED" + | "ROLLING" + | "STAGED"; +export const GetDeploymentResponseBodyCase0ReadySubstate = + /*@__PURE__*/ S.String; + /** Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld. */ export interface GetDeploymentResponseBodyCase0 { alias?: GetDeploymentResponseBodyCase0AliasList; @@ -14132,6 +14140,7 @@ export interface GetDeploymentResponseBodyCase0 { aliasWarning?: CancelDeploymentResponseAliasWarning | null; errorCode?: string; errorMessage?: string | null; + readySubstate?: GetDeploymentResponseBodyCase0ReadySubstate; } export const GetDeploymentResponseBodyCase0 = /*@__PURE__*/ S.suspend(() => S.Struct({ @@ -14144,6 +14153,7 @@ export const GetDeploymentResponseBodyCase0 = /*@__PURE__*/ S.suspend(() => aliasWarning: S.optional(S.NullOr(CancelDeploymentResponseAliasWarning)), errorCode: S.optional(S.String), errorMessage: S.optional(S.NullOr(S.String)), + readySubstate: S.optional(GetDeploymentResponseBodyCase0ReadySubstate), }), ).annotate({ identifier: "GetDeploymentResponseBodyCase0", @@ -14833,7 +14843,8 @@ export type GetDeploymentResponseBodyCase1ReadyState = | "ERROR" | "INITIALIZING" | "QUEUED" - | "READY"; + | "READY" + | "DELETED"; export const GetDeploymentResponseBodyCase1ReadyState = /*@__PURE__*/ S.String; /** An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` */ @@ -20961,7 +20972,8 @@ export type GetDeploymentResponseBodyCase2ReadyState = | "ERROR" | "INITIALIZING" | "QUEUED" - | "READY"; + | "READY" + | "DELETED"; export const GetDeploymentResponseBodyCase2ReadyState = /*@__PURE__*/ S.String; /** An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` */ @@ -22438,9 +22450,14 @@ export const GetDeploymentFileContentsRequest = /*@__PURE__*/ S.suspend(() => identifier: "GetDeploymentFileContentsRequest", }) as any as S.Schema; -export interface GetDeploymentFileContentsResponse {} +export interface GetDeploymentFileContentsResponse { + /** The file contents, base64-encoded */ + data: string; +} export const GetDeploymentFileContentsResponse = /*@__PURE__*/ S.suspend(() => - S.Struct({}), + S.Struct({ + data: S.String, + }), ).annotate({ identifier: "GetDeploymentFileContentsResponse", }) as any as S.Schema; @@ -23454,6 +23471,7 @@ export interface UploadFileRequest { xNowDigest?: string; /** The file size as an alternative to `Content-Length` */ xNowSize?: number; + body?: Blob | Uint8Array | ArrayBuffer | string; } export const UploadFileRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ @@ -23463,7 +23481,15 @@ export const UploadFileRequest = /*@__PURE__*/ S.suspend(() => xVercelDigest: S.optional(S.String.pipe(T.Header("x-Vercel-Digest"))), xNowDigest: S.optional(S.String.pipe(T.Header("x-Now-Digest"))), xNowSize: S.optional(S.Number.pipe(T.Header("x-Now-Size"))), - }).pipe(T.Http({ method: "POST", uri: "/v2/files", code: 200 })), + body: S.optional(S.String.pipe(T.HttpBody())), + }).pipe( + T.Http({ + method: "POST", + uri: "/v2/files", + code: 200, + bodyMediaType: "application/octet-stream", + }), + ), ).annotate({ identifier: "UploadFileRequest", }) as any as S.Schema; diff --git a/packages/vercel/src/services/dns.ts b/packages/vercel/src/services/dns.ts index 5d60ad7dc..30f11b9a2 100644 --- a/packages/vercel/src/services/dns.ts +++ b/packages/vercel/src/services/dns.ts @@ -71,6 +71,47 @@ export type CreateRecordRequestType = | "NS"; export const CreateRecordRequestType = /*@__PURE__*/ S.String; +/** The SRV record payload. Required for SRV records. */ +export interface CreateRecordRequestSrv { + /** The SRV target hostname. */ + target: string; + /** The SRV weight. */ + weight: number; + /** The SRV port. */ + port: number; + /** The SRV priority. */ + priority: number; +} +export const CreateRecordRequestSrv = /*@__PURE__*/ S.suspend(() => + S.Struct({ + target: S.String, + weight: S.Number, + port: S.Number, + priority: S.Number, + }), +).annotate({ + identifier: "CreateRecordRequestSrv", +}) as any as S.Schema; + +/** The HTTPS record payload. Required for HTTPS records. */ +export interface CreateRecordRequestHttps { + /** The HTTPS priority. */ + priority: number; + /** The HTTPS target hostname. */ + target: string; + /** The HTTPS parameter string. */ + params?: string; +} +export const CreateRecordRequestHttps = /*@__PURE__*/ S.suspend(() => + S.Struct({ + priority: S.Number, + target: S.String, + params: S.optional(S.String), + }), +).annotate({ + identifier: "CreateRecordRequestHttps", +}) as any as S.Schema; + export interface CreateRecordRequest { /** The domain used to create the DNS record. */ domain: string; @@ -80,6 +121,20 @@ export interface CreateRecordRequest { slug?: string; /** The type of record, it could be one of the valid DNS records. */ type: CreateRecordRequestType | (string & {}); + /** A subdomain name or an empty string for the root domain. Required for every record type except SRV and HTTPS, whose name is derived from srv/https. */ + name?: string; + /** The record value (address, hostname, or text depending on the record type). Not used for SRV and HTTPS records, which use the srv/https objects instead. */ + value?: string; + /** The TTL value. Must be a number between 60 and 2147483647. Default value is 60. */ + ttl?: number; + /** The MX priority value of the DNS record. Required for MX records. */ + mxPriority?: number; + /** The SRV record payload. Required for SRV records. */ + srv?: CreateRecordRequestSrv; + /** The HTTPS record payload. Required for HTTPS records. */ + https?: CreateRecordRequestHttps; + /** A comment to add context on what this DNS record is for */ + comment?: string; } export const CreateRecordRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ @@ -87,6 +142,13 @@ export const CreateRecordRequest = /*@__PURE__*/ S.suspend(() => teamId: S.optional(S.String.pipe(T.Query())), slug: S.optional(S.String.pipe(T.Query())), type: CreateRecordRequestType, + name: S.optional(S.String), + value: S.optional(S.String), + ttl: S.optional(S.Number), + mxPriority: S.optional(S.Number), + srv: S.optional(CreateRecordRequestSrv), + https: S.optional(CreateRecordRequestHttps), + comment: S.optional(S.String), }).pipe( T.Http({ method: "POST", uri: "/v2/domains/{domain}/records", code: 200 }), ), diff --git a/packages/vercel/src/services/domains.ts b/packages/vercel/src/services/domains.ts index 51a9c5ca1..7a28aedd3 100644 --- a/packages/vercel/src/services/domains.ts +++ b/packages/vercel/src/services/domains.ts @@ -203,14 +203,26 @@ export interface CreateOrTransferDomainRequest { teamId?: string; /** The Team slug to perform the request on behalf of. */ slug?: string; - /** The domain operation to perform. It can be either `add` or `move-in`. */ + /** The domain name you want to add. */ + name: string; + /** The domain operation to perform. Omit (or `add`) to add the domain; `move-in` moves a domain from another Vercel account using `token`. Live behavior: sending `method: "add"` together with `name` fails the server-side oneOf validation — omit `method` entirely when adding. */ method?: string; + /** Whether the domain has the Vercel Edge Network enabled or not. */ + cdnEnabled?: boolean; + /** Whether to create a DNS zone on Vercel. Set `true` if using Vercel nameservers (required before any DNS records can be created for the domain). */ + zone?: boolean; + /** The move-in token from the Move Requested email. Only used with `method: "move-in"`. */ + token?: string; } export const CreateOrTransferDomainRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ teamId: S.optional(S.String.pipe(T.Query())), slug: S.optional(S.String.pipe(T.Query())), + name: S.String, method: S.optional(S.String), + cdnEnabled: S.optional(S.Boolean), + zone: S.optional(S.Boolean), + token: S.optional(S.String), }).pipe(T.Http({ method: "POST", uri: "/v7/domains", code: 200 })), ).annotate({ identifier: "CreateOrTransferDomainRequest", diff --git a/packages/vercel/src/services/edge_config_data.ts b/packages/vercel/src/services/edge_config_data.ts new file mode 100644 index 000000000..2c4016f35 --- /dev/null +++ b/packages/vercel/src/services/edge_config_data.ts @@ -0,0 +1,262 @@ +// AUTO-GENERATED by scripts/generate.ts from manual-specs (hand-authored data-plane models). Do not edit. +import * as S from "@distilled.cloud/core/schema"; +import * as Redacted from "effect/Redacted"; +import * as API from "@distilled.cloud/core/api"; +import * as C from "@distilled.cloud/core/category"; +import * as T from "../traits.ts"; +import { + EdgeConfigDataProtocol, + type VercelDataOpError, + type VercelDataOpContext, +} from "../protocol.ts"; +import * as Retry from "../retry.ts"; + +export type { VercelDataOpError, VercelDataOpContext }; + +/** 404 WITH the `x-edge-config-digest` response header — the config exists but the item does not. (`get` callers typically map this to `undefined`, `has` callers to `false`.) */ +export class EdgeConfigItemNotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()( + "EdgeConfigItemNotFound", + { + code: S.Number, + message: S.String, + }, + ).pipe(C.withBadRequestError), + [{ status: 404, header: "x-edge-config-digest" }], + ) {} + +/** Bare 404 (no `x-edge-config-digest` header) — the Edge Config itself does not exist or the token does not resolve to one. */ +export class EdgeConfigNotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("EdgeConfigNotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + +/** 401 — the read token was rejected. */ +export class EdgeConfigUnauthorized + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()( + "EdgeConfigUnauthorized", + { + code: S.Number, + message: S.String, + }, + ).pipe(C.withAuthError), + [{ status: 401 }], + ) {} + +export interface GetEdgeConfigDigestRequest { + /** Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin. */ + origin: string; + /** The read token — sent as the bearer. */ + token: string | Redacted.Redacted; + /** The Edge Config id (`ecfg_…`). */ + edgeConfigId: string; + /** Protocol version — pass "1". */ + version?: string; +} +export const GetEdgeConfigDigestRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + origin: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + edgeConfigId: S.String.pipe(T.Label()), + version: S.optional(S.String.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/{edgeConfigId}/digest", code: 200 })), +).annotate({ + identifier: "GetEdgeConfigDigestRequest", +}) as any as S.Schema; + +export type GetEdgeConfigDigestResponse = string; +export const GetEdgeConfigDigestResponse = /*@__PURE__*/ S.suspend(() => + S.String.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetEdgeConfigDigestResponse", +}) as any as S.Schema; + +export interface GetEdgeConfigItemRequest { + /** Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin (local emulation hands out `http://localhost:`). */ + origin: string; + /** The read token (the connection string's `token` parameter) — sent as the bearer. */ + token: string | Redacted.Redacted; + /** The Edge Config id (`ecfg_…`). */ + edgeConfigId: string; + /** The item key. */ + key: string; + /** Protocol version — pass "1" (what @vercel/edge-config sends). */ + version?: string; +} +export const GetEdgeConfigItemRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + origin: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + edgeConfigId: S.String.pipe(T.Label()), + key: S.String.pipe(T.Label()), + version: S.optional(S.String.pipe(T.Query())), + }).pipe( + T.Http({ method: "GET", uri: "/{edgeConfigId}/item/{key}", code: 200 }), + ), +).annotate({ + identifier: "GetEdgeConfigItemRequest", +}) as any as S.Schema; + +export type GetEdgeConfigItemResponse = unknown; +export const GetEdgeConfigItemResponse = /*@__PURE__*/ S.suspend(() => + S.Unknown.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetEdgeConfigItemResponse", +}) as any as S.Schema; + +export type EdgeConfigKeyList = Array; +export const EdgeConfigKeyList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface GetEdgeConfigItemsRequest { + /** Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin. */ + origin: string; + /** The read token — sent as the bearer. */ + token: string | Redacted.Redacted; + /** The Edge Config id (`ecfg_…`). */ + edgeConfigId: string; + /** Optional key filter — each entry repeats as a `key=` query parameter; omit for all items. */ + keys?: EdgeConfigKeyList; + /** Protocol version — pass "1". */ + version?: string; +} +export const GetEdgeConfigItemsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + origin: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + edgeConfigId: S.String.pipe(T.Label()), + keys: S.optional(EdgeConfigKeyList.pipe(T.Query("key"))), + version: S.optional(S.String.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/{edgeConfigId}/items", code: 200 })), +).annotate({ + identifier: "GetEdgeConfigItemsRequest", +}) as any as S.Schema; + +/** Items as a key → JSON value record. */ +export type EdgeConfigItems = { [key: string]: unknown | undefined }; +export const EdgeConfigItems = /*@__PURE__*/ S.Record( + S.String, + S.Unknown, +) as any as S.Schema; + +export type GetEdgeConfigItemsResponse = EdgeConfigItems; +export const GetEdgeConfigItemsResponse = /*@__PURE__*/ S.suspend(() => + EdgeConfigItems.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetEdgeConfigItemsResponse", +}) as any as S.Schema; + +export interface HasEdgeConfigItemRequest { + /** Read-plane origin — `https://edge-config.vercel.com` live, or the connection string's origin. */ + origin: string; + /** The read token — sent as the bearer. */ + token: string | Redacted.Redacted; + /** The Edge Config id (`ecfg_…`). */ + edgeConfigId: string; + /** The item key. */ + key: string; + /** Protocol version — pass "1". */ + version?: string; +} +export const HasEdgeConfigItemRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + origin: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + edgeConfigId: S.String.pipe(T.Label()), + key: S.String.pipe(T.Label()), + version: S.optional(S.String.pipe(T.Query())), + }).pipe( + T.Http({ method: "HEAD", uri: "/{edgeConfigId}/item/{key}", code: 200 }), + ), +).annotate({ + identifier: "HasEdgeConfigItemRequest", +}) as any as S.Schema; + +/** A 200 means the item exists; a missing item is the typed EdgeConfigItemNotFound (map it to `false`). */ +export interface HasEdgeConfigItemResponse {} +export const HasEdgeConfigItemResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "HasEdgeConfigItemResponse", +}) as any as S.Schema; + +export type GetEdgeConfigDigestError = + | EdgeConfigNotFound + | EdgeConfigUnauthorized + | VercelDataOpError; +/** The config's content digest: `GET {origin}/{edgeConfigId}/digest?version=1`. */ +export const getEdgeConfigDigest: API.OperationMethod< + GetEdgeConfigDigestRequest, + GetEdgeConfigDigestResponse, + GetEdgeConfigDigestError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetEdgeConfigDigestRequest, + output: GetEdgeConfigDigestResponse, + errors: [EdgeConfigNotFound, EdgeConfigUnauthorized], + protocol: EdgeConfigDataProtocol, + retry: Retry.Retry, +})); + +export type GetEdgeConfigItemError = + | EdgeConfigItemNotFound + | EdgeConfigNotFound + | EdgeConfigUnauthorized + | VercelDataOpError; +/** Read a single item: `GET {origin}/{edgeConfigId}/item/{key}?version=1`. A missing item is the typed EdgeConfigItemNotFound (map it to `undefined`). */ +export const getEdgeConfigItem: API.OperationMethod< + GetEdgeConfigItemRequest, + GetEdgeConfigItemResponse, + GetEdgeConfigItemError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetEdgeConfigItemRequest, + output: GetEdgeConfigItemResponse, + errors: [EdgeConfigItemNotFound, EdgeConfigNotFound, EdgeConfigUnauthorized], + protocol: EdgeConfigDataProtocol, + retry: Retry.Retry, +})); + +export type GetEdgeConfigItemsError = + | EdgeConfigNotFound + | EdgeConfigUnauthorized + | VercelDataOpError; +/** Read all items (or a key subset): `GET {origin}/{edgeConfigId}/items?version=1[&key=…]`. */ +export const getEdgeConfigItems: API.OperationMethod< + GetEdgeConfigItemsRequest, + GetEdgeConfigItemsResponse, + GetEdgeConfigItemsError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetEdgeConfigItemsRequest, + output: GetEdgeConfigItemsResponse, + errors: [EdgeConfigNotFound, EdgeConfigUnauthorized], + protocol: EdgeConfigDataProtocol, + retry: Retry.Retry, +})); + +export type HasEdgeConfigItemError = + | EdgeConfigItemNotFound + | EdgeConfigNotFound + | EdgeConfigUnauthorized + | VercelDataOpError; +/** Existence check: `HEAD {origin}/{edgeConfigId}/item/{key}?version=1` — 200 exists, typed EdgeConfigItemNotFound otherwise. */ +export const hasEdgeConfigItem: API.OperationMethod< + HasEdgeConfigItemRequest, + HasEdgeConfigItemResponse, + HasEdgeConfigItemError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: HasEdgeConfigItemRequest, + output: HasEdgeConfigItemResponse, + errors: [EdgeConfigItemNotFound, EdgeConfigNotFound, EdgeConfigUnauthorized], + protocol: EdgeConfigDataProtocol, + retry: Retry.Retry, +})); diff --git a/packages/vercel/src/services/environment.ts b/packages/vercel/src/services/environment.ts index f7918749b..bab6ca0c8 100644 --- a/packages/vercel/src/services/environment.ts +++ b/packages/vercel/src/services/environment.ts @@ -21,6 +21,15 @@ export class BadRequest [{ status: 400 }], ) {} +export class Conflict + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("Conflict", { + code: S.Number, + message: S.String, + }).pipe(C.withConflictError), + [{ status: 409 }], + ) {} + export class Forbidden extends /*@__PURE__*/ T.applyErrorMatchers( /*@__PURE__*/ S.TaggedError()("Forbidden", { @@ -78,7 +87,7 @@ export interface CreateCustomEnvironmentRequest { idOrName: string; /** The Team identifier to perform the request on behalf of. */ teamId?: string; - /** The Team slug to perform the request on behalf of. */ + /** The slug of the custom environment to create. */ slug?: string; /** Description of the custom environment. This is optional. */ description?: string; @@ -91,7 +100,7 @@ export const CreateCustomEnvironmentRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ idOrName: S.String.pipe(T.Label()), teamId: S.optional(S.String.pipe(T.Query())), - slug: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String), description: S.optional(S.String), branchMatcher: S.optional(CreateCustomEnvironmentRequestBranchMatcher), copyEnvVarsFrom: S.optional(S.String), @@ -1647,7 +1656,7 @@ export interface UpdateCustomEnvironmentRequest { environmentSlugOrId: string; /** The Team identifier to perform the request on behalf of. */ teamId?: string; - /** The Team slug to perform the request on behalf of. */ + /** The slug of the custom environment. */ slug?: string; /** Description of the custom environment. This is optional. */ description?: string; @@ -1659,7 +1668,7 @@ export const UpdateCustomEnvironmentRequest = /*@__PURE__*/ S.suspend(() => idOrName: S.String.pipe(T.Label()), environmentSlugOrId: S.String.pipe(T.Label()), teamId: S.optional(S.String.pipe(T.Query())), - slug: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String), description: S.optional(S.String), branchMatcher: S.optional( S.NullOr(UpdateCustomEnvironmentRequestBranchMatcher), @@ -2208,6 +2217,7 @@ export type CreateSharedEnvVariableError = | BadRequest | PaymentRequired | Forbidden + | Conflict | VercelOpError; /** Create one or more shared environment variables Creates shared environment variable(s) for a team. */ export const createSharedEnvVariable: API.OperationMethod< @@ -2218,7 +2228,7 @@ export const createSharedEnvVariable: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: CreateSharedEnvVariableRequest, output: CreateSharedEnvVariableResponse, - errors: [BadRequest, PaymentRequired, Forbidden], + errors: [BadRequest, PaymentRequired, Forbidden, Conflict], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -2227,6 +2237,7 @@ export type DeleteSharedEnvVariableError = | BadRequest | PaymentRequired | Forbidden + | NotFound | VercelOpError; /** Delete one or more Env Var Deletes one or many Shared Environment Variables for a given team. */ export const deleteSharedEnvVariable: API.OperationMethod< @@ -2237,7 +2248,7 @@ export const deleteSharedEnvVariable: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: DeleteSharedEnvVariableRequest, output: DeleteSharedEnvVariableResponse, - errors: [BadRequest, PaymentRequired, Forbidden], + errors: [BadRequest, PaymentRequired, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -2264,6 +2275,7 @@ export const getCustomEnvironment: API.OperationMethod< export type GetProjectsByIdOrNameCustomEnvironmentsError = | BadRequest | Forbidden + | NotFound | VercelOpError; /** Retrieve custom environments Retrieve custom environments for the project. Must not be named 'Production' or 'Preview'. */ export const getProjectsByIdOrNameCustomEnvironments: API.OperationMethod< @@ -2274,12 +2286,16 @@ export const getProjectsByIdOrNameCustomEnvironments: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetProjectsByIdOrNameCustomEnvironmentsRequest, output: GetProjectsByIdOrNameCustomEnvironmentsResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); -export type GetSharedEnvVarError = BadRequest | Forbidden | VercelOpError; +export type GetSharedEnvVarError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Retrieve the decrypted value of a Shared Environment Variable by id. Retrieve the decrypted value of a Shared Environment Variable by id. */ export const getSharedEnvVar: API.OperationMethod< GetSharedEnvVarRequest, @@ -2289,7 +2305,7 @@ export const getSharedEnvVar: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetSharedEnvVarRequest, output: GetSharedEnvVarResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -2316,6 +2332,7 @@ export const listSharedEnvVariable: API.OperationMethod< export type RemoveCustomEnvironmentError = | BadRequest | Forbidden + | NotFound | VercelOpError; /** Remove a custom environment Remove a custom environment for the project. Must not be named 'Production' or 'Preview'. */ export const removeCustomEnvironment: API.OperationMethod< @@ -2326,7 +2343,7 @@ export const removeCustomEnvironment: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: RemoveCustomEnvironmentRequest, output: RemoveCustomEnvironmentResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -2372,6 +2389,7 @@ export type UpdateSharedEnvVariableError = | BadRequest | PaymentRequired | Forbidden + | NotFound | VercelOpError; /** Updates one or more shared environment variables Updates a given Shared Environment Variable for a Team. */ export const updateSharedEnvVariable: API.OperationMethod< @@ -2382,7 +2400,7 @@ export const updateSharedEnvVariable: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: UpdateSharedEnvVariableRequest, output: UpdateSharedEnvVariableResponse, - errors: [BadRequest, PaymentRequired, Forbidden], + errors: [BadRequest, PaymentRequired, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/feature_flags.ts b/packages/vercel/src/services/feature_flags.ts index f1430143c..9e48513bf 100644 --- a/packages/vercel/src/services/feature_flags.ts +++ b/packages/vercel/src/services/feature_flags.ts @@ -668,8 +668,8 @@ export interface CreateFlagRequest { projectIdOrName: string; /** The Team identifier to perform the request on behalf of. */ teamId?: string; - /** The Team slug to perform the request on behalf of. */ - slug?: string; + /** A unique (per project) key for the flag, composed of letters, numbers, dashes, and underscores */ + slug: string; /** The kind of flag */ kind: CreateFlagRequestKind | (string & {}); /** The variants of the flag */ @@ -692,7 +692,7 @@ export const CreateFlagRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ projectIdOrName: S.String.pipe(T.Label()), teamId: S.optional(S.String.pipe(T.Query())), - slug: S.optional(S.String.pipe(T.Query())), + slug: S.String, kind: CreateFlagRequestKind, variants: S.optional(CreateFlagRequestVariantsList), environments: CreateFlagRequestEnvironmentsMap, diff --git a/packages/vercel/src/services/global_config.ts b/packages/vercel/src/services/global_config.ts index 580975875..6d40f2736 100644 --- a/packages/vercel/src/services/global_config.ts +++ b/packages/vercel/src/services/global_config.ts @@ -68,14 +68,13 @@ export const CreateEdgeConfigRequestItemsMap = /*@__PURE__*/ S.Record( export interface CreateEdgeConfigRequest { /** The Team identifier to perform the request on behalf of. */ teamId?: string; - /** The Team slug to perform the request on behalf of. */ - slug?: string; + slug: string; items?: CreateEdgeConfigRequestItemsMap; } export const CreateEdgeConfigRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ teamId: S.optional(S.String.pipe(T.Query())), - slug: S.optional(S.String.pipe(T.Query())), + slug: S.String, items: S.optional(CreateEdgeConfigRequestItemsMap), }).pipe(T.Http({ method: "POST", uri: "/v1/global-config", code: 200 })), ).annotate({ @@ -837,49 +836,56 @@ export const GetEdgeConfigsRequest = /*@__PURE__*/ S.suspend(() => identifier: "GetEdgeConfigsRequest", }) as any as S.Schema; -export type GetEdgeConfigsResponsePurposeCase0Type = "flags"; -export const GetEdgeConfigsResponsePurposeCase0Type = /*@__PURE__*/ S.String; +export type GetEdgeConfigsResponseBodyItemPurposeCase0Type = "flags"; +export const GetEdgeConfigsResponseBodyItemPurposeCase0Type = + /*@__PURE__*/ S.String; -export interface GetEdgeConfigsResponsePurposeCase0 { - type: GetEdgeConfigsResponsePurposeCase0Type; +export interface GetEdgeConfigsResponseBodyItemPurposeCase0 { + type: GetEdgeConfigsResponseBodyItemPurposeCase0Type; projectId: string; } -export const GetEdgeConfigsResponsePurposeCase0 = /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetEdgeConfigsResponsePurposeCase0Type, - projectId: S.String, - }), -).annotate({ - identifier: "GetEdgeConfigsResponsePurposeCase0", -}) as any as S.Schema; +export const GetEdgeConfigsResponseBodyItemPurposeCase0 = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + type: GetEdgeConfigsResponseBodyItemPurposeCase0Type, + projectId: S.String, + }), + ).annotate({ + identifier: "GetEdgeConfigsResponseBodyItemPurposeCase0", + }) as any as S.Schema; -export type GetEdgeConfigsResponsePurposeCase1Type = "experimentation"; -export const GetEdgeConfigsResponsePurposeCase1Type = /*@__PURE__*/ S.String; +export type GetEdgeConfigsResponseBodyItemPurposeCase1Type = "experimentation"; +export const GetEdgeConfigsResponseBodyItemPurposeCase1Type = + /*@__PURE__*/ S.String; -export interface GetEdgeConfigsResponsePurposeCase1 { - type: GetEdgeConfigsResponsePurposeCase1Type; +export interface GetEdgeConfigsResponseBodyItemPurposeCase1 { + type: GetEdgeConfigsResponseBodyItemPurposeCase1Type; resourceId: string; } -export const GetEdgeConfigsResponsePurposeCase1 = /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetEdgeConfigsResponsePurposeCase1Type, - resourceId: S.String, - }), -).annotate({ - identifier: "GetEdgeConfigsResponsePurposeCase1", -}) as any as S.Schema; +export const GetEdgeConfigsResponseBodyItemPurposeCase1 = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + type: GetEdgeConfigsResponseBodyItemPurposeCase1Type, + resourceId: S.String, + }), + ).annotate({ + identifier: "GetEdgeConfigsResponseBodyItemPurposeCase1", + }) as any as S.Schema; -export type GetEdgeConfigsResponsePurpose = - | GetEdgeConfigsResponsePurposeCase0 - | GetEdgeConfigsResponsePurposeCase1; -export const GetEdgeConfigsResponsePurpose = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export type GetEdgeConfigsResponseBodyItemPurpose = + | GetEdgeConfigsResponseBodyItemPurposeCase0 + | GetEdgeConfigsResponseBodyItemPurposeCase1; +export const GetEdgeConfigsResponseBodyItemPurpose = + /*@__PURE__*/ S.Unknown as any as S.Schema; /** Keeps track of the current state of the Edge Config while it gets transferred. */ -export type GetEdgeConfigsResponseTransfer = CreateEdgeConfigResponseTransfer; -export const GetEdgeConfigsResponseTransfer = CreateEdgeConfigResponseTransfer; +export type GetEdgeConfigsResponseBodyItemTransfer = + CreateEdgeConfigResponseTransfer; +export const GetEdgeConfigsResponseBodyItemTransfer = + CreateEdgeConfigResponseTransfer; -export interface GetEdgeConfigsResponse { +/** List of all global configs. */ +export interface GetEdgeConfigsResponseBodyItem { id: string; createdAt: number; /** The ID of the user who created the Edge Config, optional because it is not always set. */ @@ -889,7 +895,7 @@ export interface GetEdgeConfigsResponse { slug: string; updatedAt: number; digest: string; - purpose?: GetEdgeConfigsResponsePurpose; + purpose?: GetEdgeConfigsResponseBodyItemPurpose; deletedAt?: number | null; /** Keeps track of the current state of the Edge Config while it gets transferred. */ transfer?: CreateEdgeConfigResponseTransfer; @@ -899,7 +905,7 @@ export interface GetEdgeConfigsResponse { sizeInBytes: number; itemCount: number; } -export const GetEdgeConfigsResponse = /*@__PURE__*/ S.suspend(() => +export const GetEdgeConfigsResponseBodyItem = /*@__PURE__*/ S.suspend(() => S.Struct({ id: S.String, createdAt: S.Number, @@ -908,7 +914,7 @@ export const GetEdgeConfigsResponse = /*@__PURE__*/ S.suspend(() => slug: S.String, updatedAt: S.Number, digest: S.String, - purpose: S.optional(GetEdgeConfigsResponsePurpose), + purpose: S.optional(GetEdgeConfigsResponseBodyItemPurpose), deletedAt: S.optional(S.NullOr(S.Number)), transfer: S.optional(CreateEdgeConfigResponseTransfer), schema: S.optional(S.Unknown), @@ -916,6 +922,19 @@ export const GetEdgeConfigsResponse = /*@__PURE__*/ S.suspend(() => sizeInBytes: S.Number, itemCount: S.Number, }), +).annotate({ + identifier: "GetEdgeConfigsResponseBodyItem", +}) as any as S.Schema; + +export type GetEdgeConfigsResponseBodyList = + Array; +export const GetEdgeConfigsResponseBodyList = /*@__PURE__*/ S.Array( + GetEdgeConfigsResponseBodyItem, +) as any as S.Schema; + +export type GetEdgeConfigsResponse = GetEdgeConfigsResponseBodyList; +export const GetEdgeConfigsResponse = /*@__PURE__*/ S.suspend(() => + GetEdgeConfigsResponseBodyList.pipe(T.RawResponseRoot()), ).annotate({ identifier: "GetEdgeConfigsResponse", }) as any as S.Schema; @@ -1023,66 +1042,43 @@ export const GetEdgeConfigTokensRequest = /*@__PURE__*/ S.suspend(() => identifier: "GetEdgeConfigTokensRequest", }) as any as S.Schema; -export interface PatchEdgeConfigItemsRequestItemsItemCase0 { - operation: unknown; -} -export const PatchEdgeConfigItemsRequestItemsItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - operation: S.Unknown, - }), - ).annotate({ - identifier: "PatchEdgeConfigItemsRequestItemsItemCase0", - }) as any as S.Schema; - -export type PatchEdgeConfigItemsRequestItemsItemCase1Operation = - | "update" - | "upsert"; -export const PatchEdgeConfigItemsRequestItemsItemCase1Operation = - /*@__PURE__*/ S.String; +export type GetEdgeConfigTokensResponseBodyList = Array; +export const GetEdgeConfigTokensResponseBodyList = /*@__PURE__*/ S.Array( + EdgeConfigToken, +) as any as S.Schema; -export interface PatchEdgeConfigItemsRequestItemsItemCase1 { - operation: PatchEdgeConfigItemsRequestItemsItemCase1Operation | (string & {}); -} -export const PatchEdgeConfigItemsRequestItemsItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - operation: PatchEdgeConfigItemsRequestItemsItemCase1Operation, - }), - ).annotate({ - identifier: "PatchEdgeConfigItemsRequestItemsItemCase1", - }) as any as S.Schema; +export type GetEdgeConfigTokensResponse = GetEdgeConfigTokensResponseBodyList; +export const GetEdgeConfigTokensResponse = /*@__PURE__*/ S.suspend(() => + GetEdgeConfigTokensResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetEdgeConfigTokensResponse", +}) as any as S.Schema; -export type PatchEdgeConfigItemsRequestItemsItemCase2Operation = +export type PatchEdgeConfigItemsRequestItemsItemOperation = + | "create" | "update" - | "upsert"; -export const PatchEdgeConfigItemsRequestItemsItemCase2Operation = + | "upsert" + | "delete"; +export const PatchEdgeConfigItemsRequestItemsItemOperation = /*@__PURE__*/ S.String; -export interface PatchEdgeConfigItemsRequestItemsItemCase2 { - operation: PatchEdgeConfigItemsRequestItemsItemCase2Operation | (string & {}); +export interface PatchEdgeConfigItemsRequestItemsItem { + operation?: PatchEdgeConfigItemsRequestItemsItemOperation | (string & {}); + key?: string; + value?: unknown; + description?: string; } -export const PatchEdgeConfigItemsRequestItemsItemCase2 = - /*@__PURE__*/ S.suspend(() => +export const PatchEdgeConfigItemsRequestItemsItem = /*@__PURE__*/ S.suspend( + () => S.Struct({ - operation: PatchEdgeConfigItemsRequestItemsItemCase2Operation, + operation: S.optional(PatchEdgeConfigItemsRequestItemsItemOperation), + key: S.optional(S.String), + value: S.optional(S.Unknown), + description: S.optional(S.String), }), - ).annotate({ - identifier: "PatchEdgeConfigItemsRequestItemsItemCase2", - }) as any as S.Schema; - -export type PatchEdgeConfigItemsRequestItemsItemCase3 = - PatchEdgeConfigItemsRequestItemsItemCase0; -export const PatchEdgeConfigItemsRequestItemsItemCase3 = - PatchEdgeConfigItemsRequestItemsItemCase0; - -export type PatchEdgeConfigItemsRequestItemsItem = - | PatchEdgeConfigItemsRequestItemsItemCase0 - | PatchEdgeConfigItemsRequestItemsItemCase1 - | PatchEdgeConfigItemsRequestItemsItemCase2 - | PatchEdgeConfigItemsRequestItemsItemCase0; -export const PatchEdgeConfigItemsRequestItemsItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; +).annotate({ + identifier: "PatchEdgeConfigItemsRequestItemsItem", +}) as any as S.Schema; export type PatchEdgeConfigItemsRequestItemsList = Array; @@ -1209,14 +1205,13 @@ export interface UpdateEdgeConfigRequest { edgeConfigId: string; /** The Team identifier to perform the request on behalf of. */ teamId?: string; - /** The Team slug to perform the request on behalf of. */ - slug?: string; + slug: string; } export const UpdateEdgeConfigRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ edgeConfigId: S.String.pipe(T.Label()), teamId: S.optional(S.String.pipe(T.Query())), - slug: S.optional(S.String.pipe(T.Query())), + slug: S.String, }).pipe( T.Http({ method: "PUT", @@ -1572,12 +1567,12 @@ export type GetEdgeConfigTokensError = /** Get all tokens of a Global Config Returns all tokens of a Global Config. */ export const getEdgeConfigTokens: API.OperationMethod< GetEdgeConfigTokensRequest, - EdgeConfigToken, + GetEdgeConfigTokensResponse, GetEdgeConfigTokensError, VercelOpContext > = /*@__PURE__*/ API.make(() => ({ input: GetEdgeConfigTokensRequest, - output: EdgeConfigToken, + output: GetEdgeConfigTokensResponse, errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, diff --git a/packages/vercel/src/services/index.ts b/packages/vercel/src/services/index.ts index ccbb7c80d..8e409e7d4 100644 --- a/packages/vercel/src/services/index.ts +++ b/packages/vercel/src/services/index.ts @@ -5,6 +5,7 @@ export * as aliases from "./aliases.ts"; export * as artifacts from "./artifacts.ts"; export * as authentication from "./authentication.ts"; export * as billing from "./billing.ts"; +export * as blobData from "./blob_data.ts"; export * as bulkRedirects from "./bulk_redirects.ts"; export * as certs from "./certs.ts"; export * as checksV2 from "./checks_v2.ts"; @@ -15,6 +16,7 @@ export * as domainsRegistrar from "./domains_registrar.ts"; export * as domains from "./domains.ts"; export * as drains from "./drains.ts"; export * as edgeCache from "./edge_cache.ts"; +export * as edgeConfigData from "./edge_config_data.ts"; export * as environment from "./environment.ts"; export * as featureFlags from "./feature_flags.ts"; export * as globalConfig from "./global_config.ts"; @@ -28,6 +30,7 @@ export * as observability from "./observability.ts"; export * as projectMembers from "./project_members.ts"; export * as projectRoutes from "./project_routes.ts"; export * as projects from "./projects.ts"; +export * as queuesData from "./queues_data.ts"; export * as rollingRelease from "./rolling_release.ts"; export * as sandboxes from "./sandboxes.ts"; export * as security from "./security.ts"; diff --git a/packages/vercel/src/services/microfrontends.ts b/packages/vercel/src/services/microfrontends.ts index cef876d39..35695e716 100644 --- a/packages/vercel/src/services/microfrontends.ts +++ b/packages/vercel/src/services/microfrontends.ts @@ -628,9 +628,114 @@ export const GetMicrofrontendsGroupsRequest = /*@__PURE__*/ S.suspend(() => identifier: "GetMicrofrontendsGroupsRequest", }) as any as S.Schema; -export type GetMicrofrontendsGroupsResponse = unknown; +export interface GetMicrofrontendsGroupsResponseGroupsItemGroup { + id: string; + name: string; + slug: string; + fallbackEnvironment?: string; + createdAt?: number; + updatedAt?: number; +} +export const GetMicrofrontendsGroupsResponseGroupsItemGroup = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + name: S.String, + slug: S.String, + fallbackEnvironment: S.optional(S.String), + createdAt: S.optional(S.Number), + updatedAt: S.optional(S.Number), + }), + ).annotate({ + identifier: "GetMicrofrontendsGroupsResponseGroupsItemGroup", + }) as any as S.Schema; + +export type GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontendsGroupIdsList = + Array; +export const GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontendsGroupIdsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export interface GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends { + enabled: boolean; + groupIds?: GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontendsGroupIdsList; + isDefaultApp?: boolean; + defaultRoute?: string; + updatedAt?: number; +} +export const GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + enabled: S.Boolean, + groupIds: S.optional( + GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontendsGroupIdsList, + ), + isDefaultApp: S.optional(S.Boolean), + defaultRoute: S.optional(S.String), + updatedAt: S.optional(S.Number), + }), + ).annotate({ + identifier: + "GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends", + }) as any as S.Schema; + +export interface GetMicrofrontendsGroupsResponseGroupsItemProjectsItem { + id: string; + name: string; + microfrontends?: GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends; +} +export const GetMicrofrontendsGroupsResponseGroupsItemProjectsItem = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + name: S.String, + microfrontends: S.optional( + GetMicrofrontendsGroupsResponseGroupsItemProjectsItemMicrofrontends, + ), + }), + ).annotate({ + identifier: "GetMicrofrontendsGroupsResponseGroupsItemProjectsItem", + }) as any as S.Schema; + +export type GetMicrofrontendsGroupsResponseGroupsItemProjectsList = + Array; +export const GetMicrofrontendsGroupsResponseGroupsItemProjectsList = + /*@__PURE__*/ S.Array( + GetMicrofrontendsGroupsResponseGroupsItemProjectsItem, + ) as any as S.Schema; + +export interface GetMicrofrontendsGroupsResponseGroupsItem { + group: GetMicrofrontendsGroupsResponseGroupsItemGroup; + projects: GetMicrofrontendsGroupsResponseGroupsItemProjectsList; +} +export const GetMicrofrontendsGroupsResponseGroupsItem = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + group: GetMicrofrontendsGroupsResponseGroupsItemGroup, + projects: GetMicrofrontendsGroupsResponseGroupsItemProjectsList, + }), + ).annotate({ + identifier: "GetMicrofrontendsGroupsResponseGroupsItem", + }) as any as S.Schema; + +export type GetMicrofrontendsGroupsResponseGroupsList = + Array; +export const GetMicrofrontendsGroupsResponseGroupsList = /*@__PURE__*/ S.Array( + GetMicrofrontendsGroupsResponseGroupsItem, +) as any as S.Schema; + +export interface GetMicrofrontendsGroupsResponse { + groups: GetMicrofrontendsGroupsResponseGroupsList; + maxMicrofrontendsGroupsPerTeam?: number; + maxMicrofrontendsPerGroup?: number; +} export const GetMicrofrontendsGroupsResponse = /*@__PURE__*/ S.suspend(() => - S.Unknown.pipe(T.RawResponseRoot()), + S.Struct({ + groups: GetMicrofrontendsGroupsResponseGroupsList, + maxMicrofrontendsGroupsPerTeam: S.optional(S.Number), + maxMicrofrontendsPerGroup: S.optional(S.Number), + }), ).annotate({ identifier: "GetMicrofrontendsGroupsResponse", }) as any as S.Schema; diff --git a/packages/vercel/src/services/project_members.ts b/packages/vercel/src/services/project_members.ts index 21308850b..503bae7ef 100644 --- a/packages/vercel/src/services/project_members.ts +++ b/packages/vercel/src/services/project_members.ts @@ -30,6 +30,15 @@ export class Forbidden [{ status: 403 }], ) {} +export class NotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("NotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + /** The project role of the member that will be added. */ export type AddProjectMemberRequestRole = | "ADMIN" @@ -121,25 +130,24 @@ export const GetProjectMembersRequest = /*@__PURE__*/ S.suspend(() => }) as any as S.Schema; /** Role of this user in the project. */ -export type GetProjectMembersResponseBodyCase1MembersItemRole = +export type GetProjectMembersResponseMembersItemRole = | "ADMIN" | "PROJECT_DEVELOPER" | "PROJECT_GUEST" | "PROJECT_VIEWER"; -export const GetProjectMembersResponseBodyCase1MembersItemRole = - /*@__PURE__*/ S.String; +export const GetProjectMembersResponseMembersItemRole = /*@__PURE__*/ S.String; /** Role of this user in the project. */ -export type GetProjectMembersResponseBodyCase1MembersItemComputedProjectRole = +export type GetProjectMembersResponseMembersItemComputedProjectRole = | "ADMIN" | "PROJECT_DEVELOPER" | "PROJECT_GUEST" | "PROJECT_VIEWER"; -export const GetProjectMembersResponseBodyCase1MembersItemComputedProjectRole = +export const GetProjectMembersResponseMembersItemComputedProjectRole = /*@__PURE__*/ S.String; /** The role of this user in the team. */ -export type GetProjectMembersResponseBodyCase1MembersItemTeamRole = +export type GetProjectMembersResponseMembersItemTeamRole = | "BILLING" | "CONTRIBUTOR" | "DEVELOPER" @@ -148,18 +156,18 @@ export type GetProjectMembersResponseBodyCase1MembersItemTeamRole = | "SECURITY" | "VIEWER" | "VIEWER_FOR_PLUS"; -export const GetProjectMembersResponseBodyCase1MembersItemTeamRole = +export const GetProjectMembersResponseMembersItemTeamRole = /*@__PURE__*/ S.String; -export interface GetProjectMembersResponseBodyCase1MembersItem { +export interface GetProjectMembersResponseMembersItem { /** ID of the file for the Avatar of this member. */ avatar?: string; /** The email of this member. */ email: string; /** Role of this user in the project. */ - role: GetProjectMembersResponseBodyCase1MembersItemRole; + role: GetProjectMembersResponseMembersItemRole; /** Role of this user in the project. */ - computedProjectRole: GetProjectMembersResponseBodyCase1MembersItemComputedProjectRole; + computedProjectRole: GetProjectMembersResponseMembersItemComputedProjectRole; /** The ID of this user. */ uid: string; /** The unique username of this user. */ @@ -169,77 +177,61 @@ export interface GetProjectMembersResponseBodyCase1MembersItem { /** Timestamp in milliseconds when this member was added. */ createdAt: number; /** The role of this user in the team. */ - teamRole: GetProjectMembersResponseBodyCase1MembersItemTeamRole; + teamRole: GetProjectMembersResponseMembersItemTeamRole; } -export const GetProjectMembersResponseBodyCase1MembersItem = - /*@__PURE__*/ S.suspend(() => +export const GetProjectMembersResponseMembersItem = /*@__PURE__*/ S.suspend( + () => S.Struct({ avatar: S.optional(S.String), email: S.String, - role: GetProjectMembersResponseBodyCase1MembersItemRole, + role: GetProjectMembersResponseMembersItemRole, computedProjectRole: - GetProjectMembersResponseBodyCase1MembersItemComputedProjectRole, + GetProjectMembersResponseMembersItemComputedProjectRole, uid: S.String, username: S.String, name: S.optional(S.String), createdAt: S.Number, - teamRole: GetProjectMembersResponseBodyCase1MembersItemTeamRole, + teamRole: GetProjectMembersResponseMembersItemTeamRole, }), - ).annotate({ - identifier: "GetProjectMembersResponseBodyCase1MembersItem", - }) as any as S.Schema; +).annotate({ + identifier: "GetProjectMembersResponseMembersItem", +}) as any as S.Schema; -export type GetProjectMembersResponseBodyCase1MembersList = - Array; -export const GetProjectMembersResponseBodyCase1MembersList = - /*@__PURE__*/ S.Array( - GetProjectMembersResponseBodyCase1MembersItem, - ) as any as S.Schema; +export type GetProjectMembersResponseMembersList = + Array; +export const GetProjectMembersResponseMembersList = /*@__PURE__*/ S.Array( + GetProjectMembersResponseMembersItem, +) as any as S.Schema; -export interface GetProjectMembersResponseBodyCase1Pagination { - hasNext: boolean; +export interface GetProjectMembersResponsePagination { + hasNext?: boolean; /** Amount of items in the current page. */ - count: number; + count?: number; /** Timestamp that must be used to request the next page. */ - next: number | null; + next?: number | null; /** Timestamp that must be used to request the previous page. */ - prev: number | null; + prev?: number | null; } -export const GetProjectMembersResponseBodyCase1Pagination = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - hasNext: S.Boolean, - count: S.Number, - next: S.NullOr(S.Number), - prev: S.NullOr(S.Number), - }), - ).annotate({ - identifier: "GetProjectMembersResponseBodyCase1Pagination", - }) as any as S.Schema; - -/** Paginated list of members for the project. */ -export interface GetProjectMembersResponseBodyCase1 { - members: GetProjectMembersResponseBodyCase1MembersList; - pagination: GetProjectMembersResponseBodyCase1Pagination; -} -export const GetProjectMembersResponseBodyCase1 = /*@__PURE__*/ S.suspend(() => +export const GetProjectMembersResponsePagination = /*@__PURE__*/ S.suspend(() => S.Struct({ - members: GetProjectMembersResponseBodyCase1MembersList, - pagination: GetProjectMembersResponseBodyCase1Pagination, + hasNext: S.optional(S.Boolean), + count: S.optional(S.Number), + next: S.optional(S.NullOr(S.Number)), + prev: S.optional(S.NullOr(S.Number)), }), ).annotate({ - identifier: "GetProjectMembersResponseBodyCase1", -}) as any as S.Schema; + identifier: "GetProjectMembersResponsePagination", +}) as any as S.Schema; -export type GetProjectMembersResponseBody = - | unknown - | GetProjectMembersResponseBodyCase1; -export const GetProjectMembersResponseBody = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetProjectMembersResponse = GetProjectMembersResponseBody; +export interface GetProjectMembersResponse { + members: GetProjectMembersResponseMembersList; + pagination: GetProjectMembersResponsePagination; +} export const GetProjectMembersResponse = /*@__PURE__*/ S.suspend(() => - GetProjectMembersResponseBody.pipe(T.RawResponseRoot()), + S.Struct({ + members: GetProjectMembersResponseMembersList, + pagination: GetProjectMembersResponsePagination, + }), ).annotate({ identifier: "GetProjectMembersResponse", }) as any as S.Schema; @@ -282,7 +274,11 @@ export const RemoveProjectMemberResponse = /*@__PURE__*/ S.suspend(() => identifier: "RemoveProjectMemberResponse", }) as any as S.Schema; -export type AddProjectMemberError = BadRequest | Forbidden | VercelOpError; +export type AddProjectMemberError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Adds a new member to a project. Adds a new member to the project. */ export const addProjectMember: API.OperationMethod< AddProjectMemberRequest, @@ -292,12 +288,16 @@ export const addProjectMember: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: AddProjectMemberRequest, output: AddProjectMemberResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); -export type GetProjectMembersError = BadRequest | Forbidden | VercelOpError; +export type GetProjectMembersError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** List project members Lists all members of a project. */ export const getProjectMembers: API.OperationMethod< GetProjectMembersRequest, @@ -307,12 +307,16 @@ export const getProjectMembers: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetProjectMembersRequest, output: GetProjectMembersResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); -export type RemoveProjectMemberError = BadRequest | Forbidden | VercelOpError; +export type RemoveProjectMemberError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Remove a Project Member Remove a member from a specific project */ export const removeProjectMember: API.OperationMethod< RemoveProjectMemberRequest, @@ -322,7 +326,7 @@ export const removeProjectMember: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: RemoveProjectMemberRequest, output: RemoveProjectMemberResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/project_routes.ts b/packages/vercel/src/services/project_routes.ts index 2b0c86cdb..56db7e6dd 100644 --- a/packages/vercel/src/services/project_routes.ts +++ b/packages/vercel/src/services/project_routes.ts @@ -2364,1671 +2364,50 @@ export const GetRoutesRequest = /*@__PURE__*/ S.suspend(() => identifier: "GetRoutesRequest", }) as any as S.Schema; -export type GetRoutesResponseBodyCase1RoutesItemRouteHeadersMap = { +export type GetRoutesResponseRoutesItemRouteHeadersMap = { [key: string]: string | undefined; }; -export const GetRoutesResponseBodyCase1RoutesItemRouteHeadersMap = +export const GetRoutesResponseRoutesItemRouteHeadersMap = /*@__PURE__*/ S.Record( S.String, S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase1RoutesItemRouteMethodsList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMethodsList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Type = "host"; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1Eq = - | string - | number; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1 { - eq?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Value = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0ValueCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0 { - type: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Type; - value: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Value; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Type, - value: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0Value, - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Type = - | "cookie" - | "header" - | "query"; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1Eq = - | string - | number; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1 { - eq?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Value = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1ValueCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1 { - type: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Type; - key: string; - value?: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Value; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Type, - key: S.String, - value: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1Value, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasItem = - | GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase0 - | GetRoutesResponseBodyCase1RoutesItemRouteHasItemCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteHasList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteHasList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase1RoutesItemRouteHasItem, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Type = - "host"; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1Eq = - string | number; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1 { - eq?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Value = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0ValueCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0 { - type: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Type; - value: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Value; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Type, - value: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0Value, - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Type = - | "cookie" - | "header" - | "query"; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1Eq = - string | number; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1 { - eq?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Value = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1ValueCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1 { - type: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Type; - key: string; - value?: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Value; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Type, - key: S.String, - value: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1Value, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingItem = - | GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase0 - | GetRoutesResponseBodyCase1RoutesItemRouteMissingItemCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMissingList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMissingList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase1RoutesItemRouteMissingItem, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteMitigateAction = - | "challenge" - | "deny"; -export const GetRoutesResponseBodyCase1RoutesItemRouteMitigateAction = - /*@__PURE__*/ S.String; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteMitigate { - action: GetRoutesResponseBodyCase1RoutesItemRouteMitigateAction; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteMitigate = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - action: GetRoutesResponseBodyCase1RoutesItemRouteMitigateAction, - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteMitigate", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Type = - | "request.headers" - | "request.query" - | "response.headers"; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Op = - | "append" - | "delete" - | "set"; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Op = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = - string | number; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1 { - eq?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList; - ninc?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList; - pre?: string; - suf?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKey = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKeyCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKey = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target { - key: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKey; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - key: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0TargetKey, - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0ArgsCase1List = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0ArgsCase1List = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Args = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0ArgsCase1List; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Args = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0EnvList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0EnvList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0 { - type: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Type; - op: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Op; - target: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target; - args?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Args; - env?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0EnvList; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Type, - op: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Op, - target: - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Target, - args: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0Args, - ), - env: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0EnvList, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Type = - "request.path"; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Op = - "set"; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Op = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1EnvList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1EnvList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1 { - type: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Type; - op: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Op; - args: string; - env?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1EnvList; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Type, - op: GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1Op, - args: S.String, - env: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1EnvList, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsItem = - | GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase0 - | GetRoutesResponseBodyCase1RoutesItemRouteTransformsItemCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteTransformsList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteTransformsList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsItem, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteEnvList = Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteEnvList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteLocaleRedirectMap = { - [key: string]: string | undefined; -}; -export const GetRoutesResponseBodyCase1RoutesItemRouteLocaleRedirectMap = - /*@__PURE__*/ S.Record( - S.String, - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteLocale { - redirect?: GetRoutesResponseBodyCase1RoutesItemRouteLocaleRedirectMap; - cookie?: string; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteLocale = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - redirect: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteLocaleRedirectMap, - ), - cookie: S.optional(S.String), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteLocale", - }) as any as S.Schema; - -/** Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. */ -export type GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1Type = - "service"; -export const GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1Type = - /*@__PURE__*/ S.String; - -export interface GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1 { - /** Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. */ - type?: GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1Type; - service: string; - /** Routing-only path used to select a route inside the target service. */ - path?: string; -} -export const GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1Type, - ), - service: S.String, - path: S.optional(S.String), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesItemRouteDestination = - | string - | GetRoutesResponseBodyCase1RoutesItemRouteDestinationCase1; -export const GetRoutesResponseBodyCase1RoutesItemRouteDestination = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -/** The original middleware matchers. */ -export type GetRoutesResponseBodyCase1RoutesItemRouteMiddlewareRawSrcList = - Array; -export const GetRoutesResponseBodyCase1RoutesItemRouteMiddlewareRawSrcList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -/** The route definition from @vercel/routing-utils. */ -export interface GetRoutesResponseBodyCase1RoutesItemRoute { - src: string; - dest?: string; - headers?: GetRoutesResponseBodyCase1RoutesItemRouteHeadersMap; - methods?: GetRoutesResponseBodyCase1RoutesItemRouteMethodsList; - continue?: boolean; - override?: boolean; - caseSensitive?: boolean; - check?: boolean; - important?: boolean; - status?: number; - has?: GetRoutesResponseBodyCase1RoutesItemRouteHasList; - missing?: GetRoutesResponseBodyCase1RoutesItemRouteMissingList; - mitigate?: GetRoutesResponseBodyCase1RoutesItemRouteMitigate; - transforms?: GetRoutesResponseBodyCase1RoutesItemRouteTransformsList; - env?: GetRoutesResponseBodyCase1RoutesItemRouteEnvList; - locale?: GetRoutesResponseBodyCase1RoutesItemRouteLocale; - /** Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). */ - source?: string; - destination?: GetRoutesResponseBodyCase1RoutesItemRouteDestination; - statusCode?: number; - /** A middleware key within the `output` key under the build result. Overrides a `middleware` definition. */ - middlewarePath?: string; - /** The original middleware matchers. */ - middlewareRawSrc?: GetRoutesResponseBodyCase1RoutesItemRouteMiddlewareRawSrcList; - /** A middleware index in the `middleware` key under the build result */ - middleware?: number; - respectOriginCacheControl?: boolean; -} -export const GetRoutesResponseBodyCase1RoutesItemRoute = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - src: S.String, - dest: S.optional(S.String), - headers: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteHeadersMap), - methods: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteMethodsList), - continue: S.optional(S.Boolean), - override: S.optional(S.Boolean), - caseSensitive: S.optional(S.Boolean), - check: S.optional(S.Boolean), - important: S.optional(S.Boolean), - status: S.optional(S.Number), - has: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteHasList), - missing: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteMissingList), - mitigate: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteMitigate), - transforms: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteTransformsList, - ), - env: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteEnvList), - locale: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteLocale), - source: S.optional(S.String), - destination: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteDestination, - ), - statusCode: S.optional(S.Number), - middlewarePath: S.optional(S.String), - middlewareRawSrc: S.optional( - GetRoutesResponseBodyCase1RoutesItemRouteMiddlewareRawSrcList, - ), - middleware: S.optional(S.Number), - respectOriginCacheControl: S.optional(S.Boolean), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItemRoute", - }) as any as S.Schema; - -/** The syntax type of the source pattern. Determines how the pattern is compiled to regex. */ -export type GetRoutesResponseBodyCase1RoutesItemSrcSyntax = - | "equals" - | "path-to-regexp" - | "regex"; -export const GetRoutesResponseBodyCase1RoutesItemSrcSyntax = - /*@__PURE__*/ S.String; - -/** Computed route type based on the route configuration. Only present in API responses, not stored in S3. */ -export type GetRoutesResponseBodyCase1RoutesItemRouteType = - | "redirect" - | "rewrite" - | "set_status" - | "transform"; -export const GetRoutesResponseBodyCase1RoutesItemRouteType = - /*@__PURE__*/ S.String; - -/** A routing rule with metadata for project-level routing. */ -export interface GetRoutesResponseBodyCase1RoutesItem { - /** Unique identifier for the routing rule. */ - id: string; - /** Human-readable name for the routing rule. */ - name: string; - /** Optional description of what the routing rule does. */ - description?: string; - /** Whether the routing rule is enabled. Defaults to true. */ - enabled?: boolean; - /** Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. */ - staged?: boolean; - /** The route definition from @vercel/routing-utils. */ - route: GetRoutesResponseBodyCase1RoutesItemRoute; - /** Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. */ - rawSrc?: string; - /** Original destination provided by user. */ - rawDest?: string; - /** The syntax type of the source pattern. Determines how the pattern is compiled to regex. */ - srcSyntax?: GetRoutesResponseBodyCase1RoutesItemSrcSyntax; - /** Computed route type based on the route configuration. Only present in API responses, not stored in S3. */ - routeType?: GetRoutesResponseBodyCase1RoutesItemRouteType; -} -export const GetRoutesResponseBodyCase1RoutesItem = /*@__PURE__*/ S.suspend( - () => - S.Struct({ - id: S.String, - name: S.String, - description: S.optional(S.String), - enabled: S.optional(S.Boolean), - staged: S.optional(S.Boolean), - route: GetRoutesResponseBodyCase1RoutesItemRoute, - rawSrc: S.optional(S.String), - rawDest: S.optional(S.String), - srcSyntax: S.optional(GetRoutesResponseBodyCase1RoutesItemSrcSyntax), - routeType: S.optional(GetRoutesResponseBodyCase1RoutesItemRouteType), - }), -).annotate({ - identifier: "GetRoutesResponseBodyCase1RoutesItem", -}) as any as S.Schema; - -export type GetRoutesResponseBodyCase1RoutesList = - Array; -export const GetRoutesResponseBodyCase1RoutesList = /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase1RoutesItem, -) as any as S.Schema; - -/** A version of routing rules stored in S3. */ -export type GetRoutesResponseBodyCase1Version = AddRouteResponseVersion; -export const GetRoutesResponseBodyCase1Version = AddRouteResponseVersion; - -export interface GetRoutesResponseBodyCase1 { - routes: GetRoutesResponseBodyCase1RoutesList; - /** A version of routing rules stored in S3. */ - version: AddRouteResponseVersion; - diffCount: number; -} -export const GetRoutesResponseBodyCase1 = /*@__PURE__*/ S.suspend(() => - S.Struct({ - routes: GetRoutesResponseBodyCase1RoutesList, - version: AddRouteResponseVersion, - diffCount: S.Number, - }), -).annotate({ - identifier: "GetRoutesResponseBodyCase1", -}) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHeadersMap = { - [key: string]: string | undefined; -}; -export const GetRoutesResponseBodyCase2RoutesItemRouteHeadersMap = - /*@__PURE__*/ S.Record( - S.String, - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMethodsList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMethodsList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Type = "host"; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1Eq = - | string - | number; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1 { - eq?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Value = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0ValueCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0 { - type: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Type; - value: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Value; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Type, - value: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0Value, - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Type = - | "cookie" - | "header" - | "query"; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1Eq = - | string - | number; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1 { - eq?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Value = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1ValueCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1 { - type: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Type; - key: string; - value?: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Value; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Type, - key: S.String, - value: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1Value, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasItem = - | GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase0 - | GetRoutesResponseBodyCase2RoutesItemRouteHasItemCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteHasList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteHasList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase2RoutesItemRouteHasItem, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Type = - "host"; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1Eq = - string | number; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1 { - eq?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Value = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0ValueCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0 { - type: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Type; - value: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Value; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Type, - value: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0Value, - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Type = - | "cookie" - | "header" - | "query"; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1Eq = - string | number; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1IncList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1NincList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1 { - eq?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1NincList; - pre?: string; - suf?: string; - re?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - re: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Value = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1ValueCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1 { - type: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Type; - key: string; - value?: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Value; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Type, - key: S.String, - value: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1Value, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingItem = - | GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase0 - | GetRoutesResponseBodyCase2RoutesItemRouteMissingItemCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMissingList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMissingList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase2RoutesItemRouteMissingItem, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteMitigateAction = - | "challenge" - | "deny"; -export const GetRoutesResponseBodyCase2RoutesItemRouteMitigateAction = - /*@__PURE__*/ S.String; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteMitigate { - action: GetRoutesResponseBodyCase2RoutesItemRouteMitigateAction; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteMitigate = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - action: GetRoutesResponseBodyCase2RoutesItemRouteMitigateAction, - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteMitigate", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Type = - | "request.headers" - | "request.query" - | "response.headers"; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Op = - | "append" - | "delete" - | "set"; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Op = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = - string | number; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1 { - eq?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq; - neq?: string; - inc?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList; - ninc?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList; - pre?: string; - suf?: string; - gt?: number; - gte?: number; - lt?: number; - lte?: number; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq, - ), - neq: S.optional(S.String), - inc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList, - ), - ninc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList, - ), - pre: S.optional(S.String), - suf: S.optional(S.String), - gt: S.optional(S.Number), - gte: S.optional(S.Number), - lt: S.optional(S.Number), - lte: S.optional(S.Number), - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKey = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKeyCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKey = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target { - key: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKey; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - key: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0TargetKey, - }), - ).annotate({ - identifier: - "GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0ArgsCase1List = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0ArgsCase1List = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Args = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0ArgsCase1List; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Args = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0EnvList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0EnvList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0 { - type: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Type; - op: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Op; - target: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target; - args?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Args; - env?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0EnvList; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Type, - op: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Op, - target: - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Target, - args: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0Args, - ), - env: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0EnvList, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Type = - "request.path"; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Type = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Op = - "set"; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Op = - /*@__PURE__*/ S.String; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1EnvList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1EnvList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1 { - type: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Type; - op: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Op; - args: string; - env?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1EnvList; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Type, - op: GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1Op, - args: S.String, - env: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1EnvList, - ), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsItem = - | GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase0 - | GetRoutesResponseBodyCase2RoutesItemRouteTransformsItemCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteTransformsList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteTransformsList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsItem, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteEnvList = Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteEnvList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteLocaleRedirectMap = { - [key: string]: string | undefined; -}; -export const GetRoutesResponseBodyCase2RoutesItemRouteLocaleRedirectMap = - /*@__PURE__*/ S.Record( - S.String, - S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteLocale { - redirect?: GetRoutesResponseBodyCase2RoutesItemRouteLocaleRedirectMap; - cookie?: string; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteLocale = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - redirect: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteLocaleRedirectMap, - ), - cookie: S.optional(S.String), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteLocale", - }) as any as S.Schema; - -/** Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. */ -export type GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1Type = - "service"; -export const GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1Type = - /*@__PURE__*/ S.String; - -export interface GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1 { - /** Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. */ - type?: GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1Type; - service: string; - /** Routing-only path used to select a route inside the target service. */ - path?: string; -} -export const GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1 = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - type: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1Type, - ), - service: S.String, - path: S.optional(S.String), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesItemRouteDestination = - | string - | GetRoutesResponseBodyCase2RoutesItemRouteDestinationCase1; -export const GetRoutesResponseBodyCase2RoutesItemRouteDestination = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -/** The original middleware matchers. */ -export type GetRoutesResponseBodyCase2RoutesItemRouteMiddlewareRawSrcList = - Array; -export const GetRoutesResponseBodyCase2RoutesItemRouteMiddlewareRawSrcList = - /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; - -/** The route definition from @vercel/routing-utils. */ -export interface GetRoutesResponseBodyCase2RoutesItemRoute { - src: string; - dest?: string; - headers?: GetRoutesResponseBodyCase2RoutesItemRouteHeadersMap; - methods?: GetRoutesResponseBodyCase2RoutesItemRouteMethodsList; - continue?: boolean; - override?: boolean; - caseSensitive?: boolean; - check?: boolean; - important?: boolean; - status?: number; - has?: GetRoutesResponseBodyCase2RoutesItemRouteHasList; - missing?: GetRoutesResponseBodyCase2RoutesItemRouteMissingList; - mitigate?: GetRoutesResponseBodyCase2RoutesItemRouteMitigate; - transforms?: GetRoutesResponseBodyCase2RoutesItemRouteTransformsList; - env?: GetRoutesResponseBodyCase2RoutesItemRouteEnvList; - locale?: GetRoutesResponseBodyCase2RoutesItemRouteLocale; - /** Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). */ - source?: string; - destination?: GetRoutesResponseBodyCase2RoutesItemRouteDestination; - statusCode?: number; - /** A middleware key within the `output` key under the build result. Overrides a `middleware` definition. */ - middlewarePath?: string; - /** The original middleware matchers. */ - middlewareRawSrc?: GetRoutesResponseBodyCase2RoutesItemRouteMiddlewareRawSrcList; - /** A middleware index in the `middleware` key under the build result */ - middleware?: number; - respectOriginCacheControl?: boolean; -} -export const GetRoutesResponseBodyCase2RoutesItemRoute = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - src: S.String, - dest: S.optional(S.String), - headers: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteHeadersMap), - methods: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteMethodsList), - continue: S.optional(S.Boolean), - override: S.optional(S.Boolean), - caseSensitive: S.optional(S.Boolean), - check: S.optional(S.Boolean), - important: S.optional(S.Boolean), - status: S.optional(S.Number), - has: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteHasList), - missing: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteMissingList), - mitigate: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteMitigate), - transforms: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteTransformsList, - ), - env: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteEnvList), - locale: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteLocale), - source: S.optional(S.String), - destination: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteDestination, - ), - statusCode: S.optional(S.Number), - middlewarePath: S.optional(S.String), - middlewareRawSrc: S.optional( - GetRoutesResponseBodyCase2RoutesItemRouteMiddlewareRawSrcList, - ), - middleware: S.optional(S.Number), - respectOriginCacheControl: S.optional(S.Boolean), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItemRoute", - }) as any as S.Schema; - -/** The syntax type of the source pattern. Determines how the pattern is compiled to regex. */ -export type GetRoutesResponseBodyCase2RoutesItemSrcSyntax = - | "equals" - | "path-to-regexp" - | "regex"; -export const GetRoutesResponseBodyCase2RoutesItemSrcSyntax = - /*@__PURE__*/ S.String; - -/** Computed route type based on the route configuration. Only present in API responses, not stored in S3. */ -export type GetRoutesResponseBodyCase2RoutesItemRouteType = - | "redirect" - | "rewrite" - | "set_status" - | "transform"; -export const GetRoutesResponseBodyCase2RoutesItemRouteType = - /*@__PURE__*/ S.String; - -/** A routing rule with metadata for project-level routing. */ -export interface GetRoutesResponseBodyCase2RoutesItem { - /** Unique identifier for the routing rule. */ - id: string; - /** Human-readable name for the routing rule. */ - name: string; - /** Optional description of what the routing rule does. */ - description?: string; - /** Whether the routing rule is enabled. Defaults to true. */ - enabled?: boolean; - /** Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. */ - staged?: boolean; - /** The route definition from @vercel/routing-utils. */ - route: GetRoutesResponseBodyCase2RoutesItemRoute; - /** Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. */ - rawSrc?: string; - /** Original destination provided by user. */ - rawDest?: string; - /** The syntax type of the source pattern. Determines how the pattern is compiled to regex. */ - srcSyntax?: GetRoutesResponseBodyCase2RoutesItemSrcSyntax; - /** Computed route type based on the route configuration. Only present in API responses, not stored in S3. */ - routeType?: GetRoutesResponseBodyCase2RoutesItemRouteType; -} -export const GetRoutesResponseBodyCase2RoutesItem = /*@__PURE__*/ S.suspend( - () => - S.Struct({ - id: S.String, - name: S.String, - description: S.optional(S.String), - enabled: S.optional(S.Boolean), - staged: S.optional(S.Boolean), - route: GetRoutesResponseBodyCase2RoutesItemRoute, - rawSrc: S.optional(S.String), - rawDest: S.optional(S.String), - srcSyntax: S.optional(GetRoutesResponseBodyCase2RoutesItemSrcSyntax), - routeType: S.optional(GetRoutesResponseBodyCase2RoutesItemRouteType), - }), -).annotate({ - identifier: "GetRoutesResponseBodyCase2RoutesItem", -}) as any as S.Schema; - -export type GetRoutesResponseBodyCase2RoutesList = - Array; -export const GetRoutesResponseBodyCase2RoutesList = /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase2RoutesItem, -) as any as S.Schema; - -/** A version of routing rules stored in S3. */ -export type GetRoutesResponseBodyCase2Version = AddRouteResponseVersion; -export const GetRoutesResponseBodyCase2Version = AddRouteResponseVersion; - -export interface GetRoutesResponseBodyCase2 { - routes: GetRoutesResponseBodyCase2RoutesList; - /** A version of routing rules stored in S3. */ - version: AddRouteResponseVersion; -} -export const GetRoutesResponseBodyCase2 = /*@__PURE__*/ S.suspend(() => - S.Struct({ - routes: GetRoutesResponseBodyCase2RoutesList, - version: AddRouteResponseVersion, - }), -).annotate({ - identifier: "GetRoutesResponseBodyCase2", -}) as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteHeadersMap = { - [key: string]: string | undefined; -}; -export const GetRoutesResponseBodyCase3RoutesItemRouteHeadersMap = - /*@__PURE__*/ S.Record( - S.String, - S.String, - ) as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteMethodsList = - Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMethodsList = +export type GetRoutesResponseRoutesItemRouteMethodsList = Array; +export const GetRoutesResponseRoutesItemRouteMethodsList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Type = "host"; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Type = +export type GetRoutesResponseRoutesItemRouteHasItemCase0Type = "host"; +export const GetRoutesResponseRoutesItemRouteHasItemCase0Type = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1Eq = +export type GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1Eq = | string | number; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export const GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1Eq = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1IncList = +export type GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1IncList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1IncList = +export const GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1IncList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1NincList = +export type GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1NincList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1NincList = +export const GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1NincList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1 { - eq?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1Eq; +export interface GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1 { + eq?: GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1Eq; neq?: string; - inc?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1NincList; + inc?: GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1IncList; + ninc?: GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1NincList; pre?: string; suf?: string; re?: string; @@ -4037,18 +2416,16 @@ export interface GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1 lt?: number; lte?: number; } -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1 = +export const GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1Eq, - ), + eq: S.optional(GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1Eq), neq: S.optional(S.String), inc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1IncList, + GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1IncList, ), ninc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1NincList, + GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1NincList, ), pre: S.optional(S.String), suf: S.optional(S.String), @@ -4059,62 +2436,61 @@ export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1 = lte: S.optional(S.Number), }), ).annotate({ - identifier: - "GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Value = +export type GetRoutesResponseRoutesItemRouteHasItemCase0Value = | string - | GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0ValueCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; + | GetRoutesResponseRoutesItemRouteHasItemCase0ValueCase1; +export const GetRoutesResponseRoutesItemRouteHasItemCase0Value = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0 { - type: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Type; - value: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Value; +export interface GetRoutesResponseRoutesItemRouteHasItemCase0 { + type: GetRoutesResponseRoutesItemRouteHasItemCase0Type; + value: GetRoutesResponseRoutesItemRouteHasItemCase0Value; } -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0 = +export const GetRoutesResponseRoutesItemRouteHasItemCase0 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Type, - value: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0Value, + type: GetRoutesResponseRoutesItemRouteHasItemCase0Type, + value: GetRoutesResponseRoutesItemRouteHasItemCase0Value, }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteHasItemCase0", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Type = +export type GetRoutesResponseRoutesItemRouteHasItemCase1Type = | "cookie" | "header" | "query"; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Type = +export const GetRoutesResponseRoutesItemRouteHasItemCase1Type = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1Eq = +export type GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1Eq = | string | number; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export const GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1Eq = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1IncList = +export type GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1IncList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1IncList = +export const GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1IncList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1NincList = +export type GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1NincList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1NincList = +export const GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1NincList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1 { - eq?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1Eq; +export interface GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1 { + eq?: GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1Eq; neq?: string; - inc?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1NincList; + inc?: GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1IncList; + ninc?: GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1NincList; pre?: string; suf?: string; re?: string; @@ -4123,18 +2499,16 @@ export interface GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1 lt?: number; lte?: number; } -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1 = +export const GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ - eq: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1Eq, - ), + eq: S.optional(GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1Eq), neq: S.optional(S.String), inc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1IncList, + GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1IncList, ), ninc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1NincList, + GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1NincList, ), pre: S.optional(S.String), suf: S.optional(S.String), @@ -4145,76 +2519,72 @@ export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1 = lte: S.optional(S.Number), }), ).annotate({ - identifier: - "GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Value = +export type GetRoutesResponseRoutesItemRouteHasItemCase1Value = | string - | GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1ValueCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; + | GetRoutesResponseRoutesItemRouteHasItemCase1ValueCase1; +export const GetRoutesResponseRoutesItemRouteHasItemCase1Value = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1 { - type: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Type; +export interface GetRoutesResponseRoutesItemRouteHasItemCase1 { + type: GetRoutesResponseRoutesItemRouteHasItemCase1Type; key: string; - value?: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Value; + value?: GetRoutesResponseRoutesItemRouteHasItemCase1Value; } -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1 = +export const GetRoutesResponseRoutesItemRouteHasItemCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Type, + type: GetRoutesResponseRoutesItemRouteHasItemCase1Type, key: S.String, - value: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1Value, - ), + value: S.optional(GetRoutesResponseRoutesItemRouteHasItemCase1Value), }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteHasItem = - | GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase0 - | GetRoutesResponseBodyCase3RoutesItemRouteHasItemCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteHasList = - Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteHasList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase3RoutesItemRouteHasItem, - ) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteHasItemCase1", + }) as any as S.Schema; + +export type GetRoutesResponseRoutesItemRouteHasItem = + | GetRoutesResponseRoutesItemRouteHasItemCase0 + | GetRoutesResponseRoutesItemRouteHasItemCase1; +export const GetRoutesResponseRoutesItemRouteHasItem = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Type = - "host"; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Type = +export type GetRoutesResponseRoutesItemRouteHasList = + Array; +export const GetRoutesResponseRoutesItemRouteHasList = /*@__PURE__*/ S.Array( + GetRoutesResponseRoutesItemRouteHasItem, +) as any as S.Schema; + +export type GetRoutesResponseRoutesItemRouteMissingItemCase0Type = "host"; +export const GetRoutesResponseRoutesItemRouteMissingItemCase0Type = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1Eq = - string | number; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export type GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1Eq = + | string + | number; +export const GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1Eq = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1IncList = +export type GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1IncList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1IncList = +export const GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1IncList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1NincList = +export type GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1NincList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1NincList = +export const GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1NincList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1 { - eq?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1Eq; +export interface GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1 { + eq?: GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1Eq; neq?: string; - inc?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1NincList; + inc?: GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1IncList; + ninc?: GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1NincList; pre?: string; suf?: string; re?: string; @@ -4223,18 +2593,18 @@ export interface GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueC lt?: number; lte?: number; } -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1 = +export const GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ eq: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1Eq, + GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1Eq, ), neq: S.optional(S.String), inc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1IncList, + GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1IncList, ), ninc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1NincList, + GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1NincList, ), pre: S.optional(S.String), suf: S.optional(S.String), @@ -4245,61 +2615,61 @@ export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1 lte: S.optional(S.Number), }), ).annotate({ - identifier: - "GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Value = +export type GetRoutesResponseRoutesItemRouteMissingItemCase0Value = | string - | GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0ValueCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; + | GetRoutesResponseRoutesItemRouteMissingItemCase0ValueCase1; +export const GetRoutesResponseRoutesItemRouteMissingItemCase0Value = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0 { - type: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Type; - value: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Value; +export interface GetRoutesResponseRoutesItemRouteMissingItemCase0 { + type: GetRoutesResponseRoutesItemRouteMissingItemCase0Type; + value: GetRoutesResponseRoutesItemRouteMissingItemCase0Value; } -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0 = +export const GetRoutesResponseRoutesItemRouteMissingItemCase0 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Type, - value: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0Value, + type: GetRoutesResponseRoutesItemRouteMissingItemCase0Type, + value: GetRoutesResponseRoutesItemRouteMissingItemCase0Value, }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteMissingItemCase0", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Type = +export type GetRoutesResponseRoutesItemRouteMissingItemCase1Type = | "cookie" | "header" | "query"; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Type = +export const GetRoutesResponseRoutesItemRouteMissingItemCase1Type = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1Eq = - string | number; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export type GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1Eq = + | string + | number; +export const GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1Eq = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1IncList = +export type GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1IncList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1IncList = +export const GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1IncList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1NincList = +export type GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1NincList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1NincList = +export const GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1NincList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1 { - eq?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1Eq; +export interface GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1 { + eq?: GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1Eq; neq?: string; - inc?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1IncList; - ninc?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1NincList; + inc?: GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1IncList; + ninc?: GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1NincList; pre?: string; suf?: string; re?: string; @@ -4308,18 +2678,18 @@ export interface GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueC lt?: number; lte?: number; } -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1 = +export const GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ eq: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1Eq, + GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1Eq, ), neq: S.optional(S.String), inc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1IncList, + GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1IncList, ), ninc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1NincList, + GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1NincList, ), pre: S.optional(S.String), suf: S.optional(S.String), @@ -4330,103 +2700,100 @@ export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1 lte: S.optional(S.Number), }), ).annotate({ - identifier: - "GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Value = +export type GetRoutesResponseRoutesItemRouteMissingItemCase1Value = | string - | GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1ValueCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Value = - /*@__PURE__*/ S.Unknown as any as S.Schema; + | GetRoutesResponseRoutesItemRouteMissingItemCase1ValueCase1; +export const GetRoutesResponseRoutesItemRouteMissingItemCase1Value = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1 { - type: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Type; +export interface GetRoutesResponseRoutesItemRouteMissingItemCase1 { + type: GetRoutesResponseRoutesItemRouteMissingItemCase1Type; key: string; - value?: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Value; + value?: GetRoutesResponseRoutesItemRouteMissingItemCase1Value; } -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1 = +export const GetRoutesResponseRoutesItemRouteMissingItemCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Type, + type: GetRoutesResponseRoutesItemRouteMissingItemCase1Type, key: S.String, - value: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1Value, - ), + value: S.optional(GetRoutesResponseRoutesItemRouteMissingItemCase1Value), }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingItem = - | GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase0 - | GetRoutesResponseBodyCase3RoutesItemRouteMissingItemCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteMissingList = - Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMissingList = + identifier: "GetRoutesResponseRoutesItemRouteMissingItemCase1", + }) as any as S.Schema; + +export type GetRoutesResponseRoutesItemRouteMissingItem = + | GetRoutesResponseRoutesItemRouteMissingItemCase0 + | GetRoutesResponseRoutesItemRouteMissingItemCase1; +export const GetRoutesResponseRoutesItemRouteMissingItem = + /*@__PURE__*/ S.Unknown as any as S.Schema; + +export type GetRoutesResponseRoutesItemRouteMissingList = + Array; +export const GetRoutesResponseRoutesItemRouteMissingList = /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase3RoutesItemRouteMissingItem, - ) as any as S.Schema; + GetRoutesResponseRoutesItemRouteMissingItem, + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteMitigateAction = +export type GetRoutesResponseRoutesItemRouteMitigateAction = | "challenge" | "deny"; -export const GetRoutesResponseBodyCase3RoutesItemRouteMitigateAction = +export const GetRoutesResponseRoutesItemRouteMitigateAction = /*@__PURE__*/ S.String; -export interface GetRoutesResponseBodyCase3RoutesItemRouteMitigate { - action: GetRoutesResponseBodyCase3RoutesItemRouteMitigateAction; +export interface GetRoutesResponseRoutesItemRouteMitigate { + action: GetRoutesResponseRoutesItemRouteMitigateAction; } -export const GetRoutesResponseBodyCase3RoutesItemRouteMitigate = - /*@__PURE__*/ S.suspend(() => +export const GetRoutesResponseRoutesItemRouteMitigate = /*@__PURE__*/ S.suspend( + () => S.Struct({ - action: GetRoutesResponseBodyCase3RoutesItemRouteMitigateAction, + action: GetRoutesResponseRoutesItemRouteMitigateAction, }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteMitigate", - }) as any as S.Schema; +).annotate({ + identifier: "GetRoutesResponseRoutesItemRouteMitigate", +}) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Type = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0Type = | "request.headers" | "request.query" | "response.headers"; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Type = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0Type = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Op = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0Op = | "append" | "delete" | "set"; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Op = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0Op = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = string | number; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1Eq = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1IncList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1NincList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1 { - eq?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq; +export interface GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1 { + eq?: GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1Eq; neq?: string; - inc?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList; - ninc?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList; + inc?: GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1IncList; + ninc?: GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1NincList; pre?: string; suf?: string; gt?: number; @@ -4434,18 +2801,18 @@ export interface GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Tar lt?: number; lte?: number; } -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1 = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ eq: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1Eq, + GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1Eq, ), neq: S.optional(S.String), inc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1IncList, + GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1IncList, ), ninc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1NincList, + GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1NincList, ), pre: S.optional(S.String), suf: S.optional(S.String), @@ -4456,280 +2823,262 @@ export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetK }), ).annotate({ identifier: - "GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1", - }) as any as S.Schema; + "GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKey = - | string - | GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKeyCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKey = - /*@__PURE__*/ S.Unknown as any as S.Schema; +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKey = + | string + | GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKeyCase1; +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKey = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target { - key: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKey; +export interface GetRoutesResponseRoutesItemRouteTransformsItemCase0Target { + key: GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKey; } -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0Target = /*@__PURE__*/ S.suspend(() => S.Struct({ - key: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0TargetKey, + key: GetRoutesResponseRoutesItemRouteTransformsItemCase0TargetKey, }), ).annotate({ - identifier: - "GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteTransformsItemCase0Target", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0ArgsCase1List = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0ArgsCase1List = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0ArgsCase1List = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0ArgsCase1List = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Args = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0Args = | string - | GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0ArgsCase1List; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Args = - /*@__PURE__*/ S.Unknown as any as S.Schema; + | GetRoutesResponseRoutesItemRouteTransformsItemCase0ArgsCase1List; +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0Args = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0EnvList = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase0EnvList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0EnvList = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0EnvList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; - -export interface GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0 { - type: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Type; - op: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Op; - target: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target; - args?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Args; - env?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0EnvList; + ) as any as S.Schema; + +export interface GetRoutesResponseRoutesItemRouteTransformsItemCase0 { + type: GetRoutesResponseRoutesItemRouteTransformsItemCase0Type; + op: GetRoutesResponseRoutesItemRouteTransformsItemCase0Op; + target: GetRoutesResponseRoutesItemRouteTransformsItemCase0Target; + args?: GetRoutesResponseRoutesItemRouteTransformsItemCase0Args; + env?: GetRoutesResponseRoutesItemRouteTransformsItemCase0EnvList; } -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0 = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase0 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Type, - op: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Op, - target: - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Target, - args: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0Args, - ), + type: GetRoutesResponseRoutesItemRouteTransformsItemCase0Type, + op: GetRoutesResponseRoutesItemRouteTransformsItemCase0Op, + target: GetRoutesResponseRoutesItemRouteTransformsItemCase0Target, + args: S.optional(GetRoutesResponseRoutesItemRouteTransformsItemCase0Args), env: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0EnvList, + GetRoutesResponseRoutesItemRouteTransformsItemCase0EnvList, ), }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteTransformsItemCase0", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Type = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase1Type = "request.path"; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Type = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase1Type = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Op = - "set"; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Op = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase1Op = "set"; +export const GetRoutesResponseRoutesItemRouteTransformsItemCase1Op = /*@__PURE__*/ S.String; -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1EnvList = +export type GetRoutesResponseRoutesItemRouteTransformsItemCase1EnvList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1EnvList = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase1EnvList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1 { - type: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Type; - op: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Op; +export interface GetRoutesResponseRoutesItemRouteTransformsItemCase1 { + type: GetRoutesResponseRoutesItemRouteTransformsItemCase1Type; + op: GetRoutesResponseRoutesItemRouteTransformsItemCase1Op; args: string; - env?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1EnvList; + env?: GetRoutesResponseRoutesItemRouteTransformsItemCase1EnvList; } -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1 = +export const GetRoutesResponseRoutesItemRouteTransformsItemCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Type, - op: GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1Op, + type: GetRoutesResponseRoutesItemRouteTransformsItemCase1Type, + op: GetRoutesResponseRoutesItemRouteTransformsItemCase1Op, args: S.String, env: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1EnvList, + GetRoutesResponseRoutesItemRouteTransformsItemCase1EnvList, ), }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1", - }) as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsItem = - | GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase0 - | GetRoutesResponseBodyCase3RoutesItemRouteTransformsItemCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsItem = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponseBodyCase3RoutesItemRouteTransformsList = - Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteTransformsList = - /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsItem, - ) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteTransformsItemCase1", + }) as any as S.Schema; + +export type GetRoutesResponseRoutesItemRouteTransformsItem = + | GetRoutesResponseRoutesItemRouteTransformsItemCase0 + | GetRoutesResponseRoutesItemRouteTransformsItemCase1; +export const GetRoutesResponseRoutesItemRouteTransformsItem = + /*@__PURE__*/ S.Unknown as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteEnvList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteEnvList = +export type GetRoutesResponseRoutesItemRouteTransformsList = + Array; +export const GetRoutesResponseRoutesItemRouteTransformsList = /*@__PURE__*/ S.Array( - S.String, - ) as any as S.Schema; + GetRoutesResponseRoutesItemRouteTransformsItem, + ) as any as S.Schema; + +export type GetRoutesResponseRoutesItemRouteEnvList = Array; +export const GetRoutesResponseRoutesItemRouteEnvList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteLocaleRedirectMap = { +export type GetRoutesResponseRoutesItemRouteLocaleRedirectMap = { [key: string]: string | undefined; }; -export const GetRoutesResponseBodyCase3RoutesItemRouteLocaleRedirectMap = +export const GetRoutesResponseRoutesItemRouteLocaleRedirectMap = /*@__PURE__*/ S.Record( S.String, S.String, - ) as any as S.Schema; + ) as any as S.Schema; -export interface GetRoutesResponseBodyCase3RoutesItemRouteLocale { - redirect?: GetRoutesResponseBodyCase3RoutesItemRouteLocaleRedirectMap; +export interface GetRoutesResponseRoutesItemRouteLocale { + redirect?: GetRoutesResponseRoutesItemRouteLocaleRedirectMap; cookie?: string; } -export const GetRoutesResponseBodyCase3RoutesItemRouteLocale = - /*@__PURE__*/ S.suspend(() => +export const GetRoutesResponseRoutesItemRouteLocale = /*@__PURE__*/ S.suspend( + () => S.Struct({ - redirect: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteLocaleRedirectMap, - ), + redirect: S.optional(GetRoutesResponseRoutesItemRouteLocaleRedirectMap), cookie: S.optional(S.String), }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteLocale", - }) as any as S.Schema; +).annotate({ + identifier: "GetRoutesResponseRoutesItemRouteLocale", +}) as any as S.Schema; /** Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. */ -export type GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1Type = - "service"; -export const GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1Type = +export type GetRoutesResponseRoutesItemRouteDestinationCase1Type = "service"; +export const GetRoutesResponseRoutesItemRouteDestinationCase1Type = /*@__PURE__*/ S.String; -export interface GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1 { +export interface GetRoutesResponseRoutesItemRouteDestinationCase1 { /** Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. */ - type?: GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1Type; + type?: GetRoutesResponseRoutesItemRouteDestinationCase1Type; service: string; /** Routing-only path used to select a route inside the target service. */ path?: string; } -export const GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1 = +export const GetRoutesResponseRoutesItemRouteDestinationCase1 = /*@__PURE__*/ S.suspend(() => S.Struct({ - type: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1Type, - ), + type: S.optional(GetRoutesResponseRoutesItemRouteDestinationCase1Type), service: S.String, path: S.optional(S.String), }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1", - }) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItemRouteDestinationCase1", + }) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesItemRouteDestination = +export type GetRoutesResponseRoutesItemRouteDestination = | string - | GetRoutesResponseBodyCase3RoutesItemRouteDestinationCase1; -export const GetRoutesResponseBodyCase3RoutesItemRouteDestination = - /*@__PURE__*/ S.Unknown as any as S.Schema; + | GetRoutesResponseRoutesItemRouteDestinationCase1; +export const GetRoutesResponseRoutesItemRouteDestination = + /*@__PURE__*/ S.Unknown as any as S.Schema; /** The original middleware matchers. */ -export type GetRoutesResponseBodyCase3RoutesItemRouteMiddlewareRawSrcList = +export type GetRoutesResponseRoutesItemRouteMiddlewareRawSrcList = Array; -export const GetRoutesResponseBodyCase3RoutesItemRouteMiddlewareRawSrcList = +export const GetRoutesResponseRoutesItemRouteMiddlewareRawSrcList = /*@__PURE__*/ S.Array( S.String, - ) as any as S.Schema; + ) as any as S.Schema; /** The route definition from @vercel/routing-utils. */ -export interface GetRoutesResponseBodyCase3RoutesItemRoute { +export interface GetRoutesResponseRoutesItemRoute { src: string; dest?: string; - headers?: GetRoutesResponseBodyCase3RoutesItemRouteHeadersMap; - methods?: GetRoutesResponseBodyCase3RoutesItemRouteMethodsList; + headers?: GetRoutesResponseRoutesItemRouteHeadersMap; + methods?: GetRoutesResponseRoutesItemRouteMethodsList; continue?: boolean; override?: boolean; caseSensitive?: boolean; check?: boolean; important?: boolean; status?: number; - has?: GetRoutesResponseBodyCase3RoutesItemRouteHasList; - missing?: GetRoutesResponseBodyCase3RoutesItemRouteMissingList; - mitigate?: GetRoutesResponseBodyCase3RoutesItemRouteMitigate; - transforms?: GetRoutesResponseBodyCase3RoutesItemRouteTransformsList; - env?: GetRoutesResponseBodyCase3RoutesItemRouteEnvList; - locale?: GetRoutesResponseBodyCase3RoutesItemRouteLocale; + has?: GetRoutesResponseRoutesItemRouteHasList; + missing?: GetRoutesResponseRoutesItemRouteMissingList; + mitigate?: GetRoutesResponseRoutesItemRouteMitigate; + transforms?: GetRoutesResponseRoutesItemRouteTransformsList; + env?: GetRoutesResponseRoutesItemRouteEnvList; + locale?: GetRoutesResponseRoutesItemRouteLocale; /** Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). */ source?: string; - destination?: GetRoutesResponseBodyCase3RoutesItemRouteDestination; + destination?: GetRoutesResponseRoutesItemRouteDestination; statusCode?: number; /** A middleware key within the `output` key under the build result. Overrides a `middleware` definition. */ middlewarePath?: string; /** The original middleware matchers. */ - middlewareRawSrc?: GetRoutesResponseBodyCase3RoutesItemRouteMiddlewareRawSrcList; + middlewareRawSrc?: GetRoutesResponseRoutesItemRouteMiddlewareRawSrcList; /** A middleware index in the `middleware` key under the build result */ middleware?: number; respectOriginCacheControl?: boolean; } -export const GetRoutesResponseBodyCase3RoutesItemRoute = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - src: S.String, - dest: S.optional(S.String), - headers: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteHeadersMap), - methods: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteMethodsList), - continue: S.optional(S.Boolean), - override: S.optional(S.Boolean), - caseSensitive: S.optional(S.Boolean), - check: S.optional(S.Boolean), - important: S.optional(S.Boolean), - status: S.optional(S.Number), - has: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteHasList), - missing: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteMissingList), - mitigate: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteMitigate), - transforms: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteTransformsList, - ), - env: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteEnvList), - locale: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteLocale), - source: S.optional(S.String), - destination: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteDestination, - ), - statusCode: S.optional(S.Number), - middlewarePath: S.optional(S.String), - middlewareRawSrc: S.optional( - GetRoutesResponseBodyCase3RoutesItemRouteMiddlewareRawSrcList, - ), - middleware: S.optional(S.Number), - respectOriginCacheControl: S.optional(S.Boolean), - }), - ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItemRoute", - }) as any as S.Schema; +export const GetRoutesResponseRoutesItemRoute = /*@__PURE__*/ S.suspend(() => + S.Struct({ + src: S.String, + dest: S.optional(S.String), + headers: S.optional(GetRoutesResponseRoutesItemRouteHeadersMap), + methods: S.optional(GetRoutesResponseRoutesItemRouteMethodsList), + continue: S.optional(S.Boolean), + override: S.optional(S.Boolean), + caseSensitive: S.optional(S.Boolean), + check: S.optional(S.Boolean), + important: S.optional(S.Boolean), + status: S.optional(S.Number), + has: S.optional(GetRoutesResponseRoutesItemRouteHasList), + missing: S.optional(GetRoutesResponseRoutesItemRouteMissingList), + mitigate: S.optional(GetRoutesResponseRoutesItemRouteMitigate), + transforms: S.optional(GetRoutesResponseRoutesItemRouteTransformsList), + env: S.optional(GetRoutesResponseRoutesItemRouteEnvList), + locale: S.optional(GetRoutesResponseRoutesItemRouteLocale), + source: S.optional(S.String), + destination: S.optional(GetRoutesResponseRoutesItemRouteDestination), + statusCode: S.optional(S.Number), + middlewarePath: S.optional(S.String), + middlewareRawSrc: S.optional( + GetRoutesResponseRoutesItemRouteMiddlewareRawSrcList, + ), + middleware: S.optional(S.Number), + respectOriginCacheControl: S.optional(S.Boolean), + }), +).annotate({ + identifier: "GetRoutesResponseRoutesItemRoute", +}) as any as S.Schema; /** The syntax type of the source pattern. Determines how the pattern is compiled to regex. */ -export type GetRoutesResponseBodyCase3RoutesItemSrcSyntax = +export type GetRoutesResponseRoutesItemSrcSyntax = | "equals" | "path-to-regexp" | "regex"; -export const GetRoutesResponseBodyCase3RoutesItemSrcSyntax = - /*@__PURE__*/ S.String; +export const GetRoutesResponseRoutesItemSrcSyntax = /*@__PURE__*/ S.String; /** Computed route type based on the route configuration. Only present in API responses, not stored in S3. */ -export type GetRoutesResponseBodyCase3RoutesItemRouteType = +export type GetRoutesResponseRoutesItemRouteType = | "redirect" | "rewrite" | "set_status" | "transform"; -export const GetRoutesResponseBodyCase3RoutesItemRouteType = - /*@__PURE__*/ S.String; +export const GetRoutesResponseRoutesItemRouteType = /*@__PURE__*/ S.String; /** A routing rule with metadata for project-level routing. */ -export interface GetRoutesResponseBodyCase3RoutesItem { +export interface GetRoutesResponseRoutesItem { /** Unique identifier for the routing rule. */ id: string; /** Human-readable name for the routing rule. */ @@ -4741,84 +3090,70 @@ export interface GetRoutesResponseBodyCase3RoutesItem { /** Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. */ staged?: boolean; /** The route definition from @vercel/routing-utils. */ - route: GetRoutesResponseBodyCase3RoutesItemRoute; + route: GetRoutesResponseRoutesItemRoute; /** Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. */ rawSrc?: string; /** Original destination provided by user. */ rawDest?: string; /** The syntax type of the source pattern. Determines how the pattern is compiled to regex. */ - srcSyntax?: GetRoutesResponseBodyCase3RoutesItemSrcSyntax; + srcSyntax?: GetRoutesResponseRoutesItemSrcSyntax; /** Computed route type based on the route configuration. Only present in API responses, not stored in S3. */ - routeType?: GetRoutesResponseBodyCase3RoutesItemRouteType; + routeType?: GetRoutesResponseRoutesItemRouteType; } -export const GetRoutesResponseBodyCase3RoutesItem = /*@__PURE__*/ S.suspend( - () => - S.Struct({ - id: S.String, - name: S.String, - description: S.optional(S.String), - enabled: S.optional(S.Boolean), - staged: S.optional(S.Boolean), - route: GetRoutesResponseBodyCase3RoutesItemRoute, - rawSrc: S.optional(S.String), - rawDest: S.optional(S.String), - srcSyntax: S.optional(GetRoutesResponseBodyCase3RoutesItemSrcSyntax), - routeType: S.optional(GetRoutesResponseBodyCase3RoutesItemRouteType), - }), +export const GetRoutesResponseRoutesItem = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + name: S.String, + description: S.optional(S.String), + enabled: S.optional(S.Boolean), + staged: S.optional(S.Boolean), + route: GetRoutesResponseRoutesItemRoute, + rawSrc: S.optional(S.String), + rawDest: S.optional(S.String), + srcSyntax: S.optional(GetRoutesResponseRoutesItemSrcSyntax), + routeType: S.optional(GetRoutesResponseRoutesItemRouteType), + }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3RoutesItem", -}) as any as S.Schema; + identifier: "GetRoutesResponseRoutesItem", +}) as any as S.Schema; -export type GetRoutesResponseBodyCase3RoutesList = - Array; -export const GetRoutesResponseBodyCase3RoutesList = /*@__PURE__*/ S.Array( - GetRoutesResponseBodyCase3RoutesItem, -) as any as S.Schema; +export type GetRoutesResponseRoutesList = Array; +export const GetRoutesResponseRoutesList = /*@__PURE__*/ S.Array( + GetRoutesResponseRoutesItem, +) as any as S.Schema; /** A version of routing rules stored in S3. */ -export type GetRoutesResponseBodyCase3Version = AddRouteResponseVersion; -export const GetRoutesResponseBodyCase3Version = AddRouteResponseVersion; +export type GetRoutesResponseVersion = AddRouteResponseVersion; +export const GetRoutesResponseVersion = AddRouteResponseVersion; -export interface GetRoutesResponseBodyCase3Limit { +export interface GetRoutesResponseLimit { maxRoutes: number; currentRoutes: number; } -export const GetRoutesResponseBodyCase3Limit = /*@__PURE__*/ S.suspend(() => +export const GetRoutesResponseLimit = /*@__PURE__*/ S.suspend(() => S.Struct({ maxRoutes: S.Number, currentRoutes: S.Number, }), ).annotate({ - identifier: "GetRoutesResponseBodyCase3Limit", -}) as any as S.Schema; + identifier: "GetRoutesResponseLimit", +}) as any as S.Schema; -export interface GetRoutesResponseBodyCase3 { - routes: GetRoutesResponseBodyCase3RoutesList; +export interface GetRoutesResponse { + routes: GetRoutesResponseRoutesList; /** A version of routing rules stored in S3. */ - version: AddRouteResponseVersion; - limit: GetRoutesResponseBodyCase3Limit; + version?: AddRouteResponseVersion | null; + limit?: GetRoutesResponseLimit; + /** Number of staged routes that differ from production. Present only when the diff query parameter is set. */ + diffCount?: number; } -export const GetRoutesResponseBodyCase3 = /*@__PURE__*/ S.suspend(() => +export const GetRoutesResponse = /*@__PURE__*/ S.suspend(() => S.Struct({ - routes: GetRoutesResponseBodyCase3RoutesList, - version: AddRouteResponseVersion, - limit: GetRoutesResponseBodyCase3Limit, + routes: GetRoutesResponseRoutesList, + version: S.optional(S.NullOr(AddRouteResponseVersion)), + limit: S.optional(GetRoutesResponseLimit), + diffCount: S.optional(S.Number), }), -).annotate({ - identifier: "GetRoutesResponseBodyCase3", -}) as any as S.Schema; - -export type GetRoutesResponseBody = - | unknown - | GetRoutesResponseBodyCase1 - | GetRoutesResponseBodyCase2 - | GetRoutesResponseBodyCase3; -export const GetRoutesResponseBody = - /*@__PURE__*/ S.Unknown as any as S.Schema; - -export type GetRoutesResponse = GetRoutesResponseBody; -export const GetRoutesResponse = /*@__PURE__*/ S.suspend(() => - GetRoutesResponseBody.pipe(T.RawResponseRoot()), ).annotate({ identifier: "GetRoutesResponse", }) as any as S.Schema; @@ -5204,7 +3539,11 @@ export const getRoutes: API.OperationMethod< retry: Retry.Retry, })); -export type GetRouteVersionsError = BadRequest | Forbidden | VercelOpError; +export type GetRouteVersionsError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Get routing rule version history Get the version history for a project's routing rules. Returns the staging version (if one exists) followed by production versions, most recent first. The staging version has `isStaging: true` and the current production version has `isLive: true`. */ export const getRouteVersions: API.OperationMethod< GetRouteVersionsRequest, @@ -5214,7 +3553,7 @@ export const getRouteVersions: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetRouteVersionsRequest, output: GetRouteVersionsResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -5222,6 +3561,7 @@ export const getRouteVersions: API.OperationMethod< export type StageRoutesError = | BadRequest | Forbidden + | NotFound | Conflict | VercelOpError; /** Stage routing rules Stage routing rules for a project. Set `overwrite` to true to replace all existing rules, or omit it to merge with existing rules by ID. Returns the new staged version. */ @@ -5233,7 +3573,7 @@ export const stageRoutes: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: StageRoutesRequest, output: StageRoutesResponse, - errors: [BadRequest, Forbidden, Conflict], + errors: [BadRequest, Forbidden, NotFound, Conflict], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/projects.ts b/packages/vercel/src/services/projects.ts index c2524ec61..3d8d3816c 100644 --- a/packages/vercel/src/services/projects.ts +++ b/packages/vercel/src/services/projects.ts @@ -9076,13 +9076,142 @@ export const CreateProjectResponse = /*@__PURE__*/ S.suspend(() => identifier: "CreateProjectResponse", }) as any as S.Schema; -export type CreateProjectEnvRequestBodyCase1List = Array; +/** The type of environment variable */ +export type CreateProjectEnvRequestBodyCase0Type = + | "system" + | "encrypted" + | "plain" + | "sensitive"; +export const CreateProjectEnvRequestBodyCase0Type = /*@__PURE__*/ S.String; + +export type CreateProjectEnvRequestBodyCase0TargetItem = + | "production" + | "preview" + | "development"; +export const CreateProjectEnvRequestBodyCase0TargetItem = + /*@__PURE__*/ S.String; + +/** The target environment of the environment variable */ +export type CreateProjectEnvRequestBodyCase0TargetList = Array< + CreateProjectEnvRequestBodyCase0TargetItem | (string & {}) +>; +export const CreateProjectEnvRequestBodyCase0TargetList = /*@__PURE__*/ S.Array( + CreateProjectEnvRequestBodyCase0TargetItem, +) as any as S.Schema; + +/** The custom environment IDs associated with the environment variable */ +export type CreateProjectEnvRequestBodyCase0CustomEnvironmentIdsList = + Array; +export const CreateProjectEnvRequestBodyCase0CustomEnvironmentIdsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export interface CreateProjectEnvRequestBodyCase0 { + /** The name of the environment variable */ + key: string; + /** The value of the environment variable */ + value: string; + /** The type of environment variable */ + type: CreateProjectEnvRequestBodyCase0Type | (string & {}); + /** The target environment of the environment variable */ + target?: CreateProjectEnvRequestBodyCase0TargetList; + /** If defined, the git branch of the environment variable (must have target=preview) */ + gitBranch?: string | null; + /** A comment to add context on what this environment variable is for */ + comment?: string; + /** The custom environment IDs associated with the environment variable */ + customEnvironmentIds?: CreateProjectEnvRequestBodyCase0CustomEnvironmentIdsList; +} +export const CreateProjectEnvRequestBodyCase0 = /*@__PURE__*/ S.suspend(() => + S.Struct({ + key: S.String, + value: S.String, + type: CreateProjectEnvRequestBodyCase0Type, + target: S.optional(CreateProjectEnvRequestBodyCase0TargetList), + gitBranch: S.optional(S.NullOr(S.String)), + comment: S.optional(S.String), + customEnvironmentIds: S.optional( + CreateProjectEnvRequestBodyCase0CustomEnvironmentIdsList, + ), + }), +).annotate({ + identifier: "CreateProjectEnvRequestBodyCase0", +}) as any as S.Schema; + +/** The type of environment variable */ +export type CreateProjectEnvRequestBodyCase1ItemType = + | "system" + | "encrypted" + | "plain" + | "sensitive"; +export const CreateProjectEnvRequestBodyCase1ItemType = /*@__PURE__*/ S.String; + +export type CreateProjectEnvRequestBodyCase1ItemTargetItem = + | "production" + | "preview" + | "development"; +export const CreateProjectEnvRequestBodyCase1ItemTargetItem = + /*@__PURE__*/ S.String; + +/** The target environment of the environment variable */ +export type CreateProjectEnvRequestBodyCase1ItemTargetList = Array< + CreateProjectEnvRequestBodyCase1ItemTargetItem | (string & {}) +>; +export const CreateProjectEnvRequestBodyCase1ItemTargetList = + /*@__PURE__*/ S.Array( + CreateProjectEnvRequestBodyCase1ItemTargetItem, + ) as any as S.Schema; + +/** The custom environment IDs associated with the environment variable */ +export type CreateProjectEnvRequestBodyCase1ItemCustomEnvironmentIdsList = + Array; +export const CreateProjectEnvRequestBodyCase1ItemCustomEnvironmentIdsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export interface CreateProjectEnvRequestBodyCase1Item { + /** The name of the environment variable */ + key: string; + /** The value of the environment variable */ + value: string; + /** The type of environment variable */ + type: CreateProjectEnvRequestBodyCase1ItemType | (string & {}); + /** The target environment of the environment variable */ + target?: CreateProjectEnvRequestBodyCase1ItemTargetList; + /** If defined, the git branch of the environment variable (must have target=preview) */ + gitBranch?: string | null; + /** A comment to add context on what this environment variable is for */ + comment?: string; + /** The custom environment IDs associated with the environment variable */ + customEnvironmentIds?: CreateProjectEnvRequestBodyCase1ItemCustomEnvironmentIdsList; +} +export const CreateProjectEnvRequestBodyCase1Item = /*@__PURE__*/ S.suspend( + () => + S.Struct({ + key: S.String, + value: S.String, + type: CreateProjectEnvRequestBodyCase1ItemType, + target: S.optional(CreateProjectEnvRequestBodyCase1ItemTargetList), + gitBranch: S.optional(S.NullOr(S.String)), + comment: S.optional(S.String), + customEnvironmentIds: S.optional( + CreateProjectEnvRequestBodyCase1ItemCustomEnvironmentIdsList, + ), + }), +).annotate({ + identifier: "CreateProjectEnvRequestBodyCase1Item", +}) as any as S.Schema; + +export type CreateProjectEnvRequestBodyCase1List = + Array; export const CreateProjectEnvRequestBodyCase1List = /*@__PURE__*/ S.Array( - S.Unknown, + CreateProjectEnvRequestBodyCase1Item, ) as any as S.Schema; export type CreateProjectEnvRequestBody = - | unknown + | CreateProjectEnvRequestBodyCase0 | CreateProjectEnvRequestBodyCase1List; export const CreateProjectEnvRequestBody = /*@__PURE__*/ S.Unknown as any as S.Schema; @@ -58506,17 +58635,20 @@ export interface UploadProjectAvatarRequest { teamId?: string; /** The Team slug to perform the request on behalf of. */ slug?: string; + body?: Blob | Uint8Array | ArrayBuffer | string; } export const UploadProjectAvatarRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ idOrName: S.String.pipe(T.Label()), teamId: S.optional(S.String.pipe(T.Query())), slug: S.optional(S.String.pipe(T.Query())), + body: S.optional(S.String.pipe(T.HttpBody())), }).pipe( T.Http({ method: "POST", uri: "/v1/projects/{idOrName}/avatar", code: 200, + bodyMediaType: "application/octet-stream", }), ), ).annotate({ @@ -66931,6 +67063,7 @@ export const createTraceSession: API.OperationMethod< export type DeleteProjectError = | BadRequest | Forbidden + | NotFound | Conflict | VercelOpError; /** Delete a Project Delete a specific project by passing either the project `id` or `name` in the URL. */ @@ -66942,7 +67075,7 @@ export const deleteProject: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: DeleteProjectRequest, output: DeleteProjectResponse, - errors: [BadRequest, Forbidden, Conflict], + errors: [BadRequest, Forbidden, NotFound, Conflict], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -66967,7 +67100,11 @@ export const editProjectEnv: API.OperationMethod< retry: Retry.Retry, })); -export type FilterProjectEnvsError = BadRequest | Forbidden | VercelOpError; +export type FilterProjectEnvsError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Retrieve the environment variables of a project by id or name Retrieve the environment variables for a given project by passing either the project `id` or `name` in the URL. */ export const filterProjectEnvs: API.OperationMethod< FilterProjectEnvsRequest, @@ -66977,12 +67114,12 @@ export const filterProjectEnvs: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: FilterProjectEnvsRequest, output: FilterProjectEnvsResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); -export type GetProjectError = BadRequest | Forbidden | VercelOpError; +export type GetProjectError = BadRequest | Forbidden | NotFound | VercelOpError; /** Find a project by id or name Get the information for a specific project by passing either the project `id` or `name` in the URL. */ export const getProject: API.OperationMethod< GetProjectRequest, @@ -66992,7 +67129,7 @@ export const getProject: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetProjectRequest, output: GetProjectResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); @@ -67012,7 +67149,11 @@ export const getProjectDomain: API.OperationMethod< retry: Retry.Retry, })); -export type GetProjectDomainsError = BadRequest | Forbidden | VercelOpError; +export type GetProjectDomainsError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Retrieve project domains by project by id or name Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. */ export const getProjectDomains: API.OperationMethod< GetProjectDomainsRequest, @@ -67022,7 +67163,7 @@ export const getProjectDomains: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetProjectDomainsRequest, output: GetProjectDomainsResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/queues_data.ts b/packages/vercel/src/services/queues_data.ts new file mode 100644 index 000000000..7fe2824ea --- /dev/null +++ b/packages/vercel/src/services/queues_data.ts @@ -0,0 +1,513 @@ +// AUTO-GENERATED by scripts/generate.ts from manual-specs (hand-authored data-plane models). Do not edit. +import * as S from "@distilled.cloud/core/schema"; +import * as Redacted from "effect/Redacted"; +import * as API from "@distilled.cloud/core/api"; +import * as C from "@distilled.cloud/core/category"; +import * as T from "../traits.ts"; +import { + QueuesDataProtocol, + type VercelDataOpError, + type VercelDataOpContext, +} from "../protocol.ts"; +import * as Retry from "../retry.ts"; + +export type { VercelDataOpError, VercelDataOpContext }; + +/** 502 on send — the platform could not discover a consumer for the topic. */ +export class ConsumerDiscoveryFailed + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()( + "ConsumerDiscoveryFailed", + { + code: S.Number, + message: S.String, + }, + ).pipe(C.withServerError), + [{ status: 502 }], + ) {} + +/** 503 on send — the project has no consumer registry configured (no deployment carries a queue trigger for this topic yet). Deliberately carries NO retryable category: it is a configuration gap, not a transient failure. */ +export class ConsumerRegistryNotConfigured + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()( + "ConsumerRegistryNotConfigured", + { + code: S.Number, + message: S.String, + }, + ), + [{ status: 503 }], + ) {} + +/** 409 on send — the `Vqs-Idempotency-Key` was already used. */ +export class DuplicateMessage + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("DuplicateMessage", { + code: S.Number, + message: S.String, + }).pipe(C.withConflictError), + [{ status: 409 }], + ) {} + +/** 410 — the message was already processed by this consumer group. */ +export class MessageAlreadyProcessed + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()( + "MessageAlreadyProcessed", + { + code: S.Number, + message: S.String, + }, + ).pipe(C.withBadRequestError), + [{ status: 410 }], + ) {} + +/** 409 — the message exists but is not in a receivable/ackable state for this consumer group (already leased, wrong receipt handle, or a duplicate whose `originalMessageId` — in the message body JSON — should be used instead). */ +export class MessageNotAvailable + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("MessageNotAvailable", { + code: S.Number, + message: S.String, + }).pipe(C.withConflictError), + [{ status: 409 }], + ) {} + +/** 404 — no such message (or receipt handle) for this consumer group. */ +export class MessageNotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("MessageNotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + +/** 400 — invalid parameters (bad visibility timeout, malformed request, …). */ +export class QueueBadRequest + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("QueueBadRequest", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 400 }], + ) {} + +/** 403 — the token is valid but not allowed to access this topic. */ +export class QueueForbidden + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("QueueForbidden", { + code: S.Number, + message: S.String, + }).pipe(C.withAuthError), + [{ status: 403 }], + ) {} + +/** 401 — the OIDC bearer token is missing, expired, or invalid. */ +export class QueueUnauthorized + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("QueueUnauthorized", { + code: S.Number, + message: S.String, + }).pipe(C.withAuthError), + [{ status: 401 }], + ) {} + +export interface AcknowledgeMessageRequest { + /** Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host. */ + region: string; + /** OIDC bearer token. */ + token: string | Redacted.Redacted; + /** Topic (queue) name. */ + topic: string; + /** Consumer group the lease belongs to. */ + consumerGroup: string; + /** The delivery's lease handle. */ + receiptHandle: string; + /** Deployment partition pin (`Vqs-Deployment-Id`). */ + deploymentId?: string; +} +export const AcknowledgeMessageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + region: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + topic: S.String.pipe(T.Label()), + consumerGroup: S.String.pipe(T.Label()), + receiptHandle: S.String.pipe(T.Label()), + deploymentId: S.optional(S.String.pipe(T.Header("Vqs-Deployment-Id"))), + }).pipe( + T.Http({ + method: "DELETE", + uri: "/api/v3/topic/{topic}/consumer/{consumerGroup}/lease/{receiptHandle}", + code: 200, + }), + ), +).annotate({ + identifier: "AcknowledgeMessageRequest", +}) as any as S.Schema; + +export interface AcknowledgeMessageResponse {} +export const AcknowledgeMessageResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "AcknowledgeMessageResponse", +}) as any as S.Schema; + +export interface ExtendLeaseRequest { + /** Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host. */ + region: string; + /** OIDC bearer token. */ + token: string | Redacted.Redacted; + /** Topic (queue) name. */ + topic: string; + /** Consumer group the lease belongs to. */ + consumerGroup: string; + /** The delivery's lease handle. */ + receiptHandle: string; + /** Deployment partition pin (`Vqs-Deployment-Id`). */ + deploymentId?: string; + /** New lease duration from now, in seconds (JSON body). */ + visibilityTimeoutSeconds: number; +} +export const ExtendLeaseRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + region: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + topic: S.String.pipe(T.Label()), + consumerGroup: S.String.pipe(T.Label()), + receiptHandle: S.String.pipe(T.Label()), + deploymentId: S.optional(S.String.pipe(T.Header("Vqs-Deployment-Id"))), + visibilityTimeoutSeconds: S.Number, + }).pipe( + T.Http({ + method: "PATCH", + uri: "/api/v3/topic/{topic}/consumer/{consumerGroup}/lease/{receiptHandle}", + code: 200, + }), + ), +).annotate({ + identifier: "ExtendLeaseRequest", +}) as any as S.Schema; + +export interface ExtendLeaseResponse {} +export const ExtendLeaseResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ExtendLeaseResponse", +}) as any as S.Schema; + +export interface ReceiveMessageByIdRequest { + /** Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host. */ + region: string; + /** OIDC bearer token. */ + token: string | Redacted.Redacted; + /** Topic (queue) name. */ + topic: string; + /** Consumer group to lease under. */ + consumerGroup: string; + /** The message id to lease (large-body push deliveries fetch by id). */ + messageId: string; + /** Deployment partition pin (`Vqs-Deployment-Id`). */ + deploymentId?: string; + /** Lease duration (`Vqs-Visibility-Timeout-Seconds`). */ + visibilityTimeoutSeconds?: number; +} +export const ReceiveMessageByIdRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + region: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + topic: S.String.pipe(T.Label()), + consumerGroup: S.String.pipe(T.Label()), + messageId: S.String.pipe(T.Label()), + deploymentId: S.optional(S.String.pipe(T.Header("Vqs-Deployment-Id"))), + visibilityTimeoutSeconds: S.optional( + S.Number.pipe(T.Header("Vqs-Visibility-Timeout-Seconds")), + ), + }).pipe( + T.Http({ + method: "POST", + uri: "/api/v3/topic/{topic}/consumer/{consumerGroup}/id/{messageId}", + code: 200, + accept: "multipart/mixed", + }), + ), +).annotate({ + identifier: "ReceiveMessageByIdRequest", +}) as any as S.Schema; + +/** One received message: the `Vqs-*` part headers plus the raw payload bytes. */ +export interface QueueMessage { + /** Unique message id (`Vqs-Message-Id`). */ + messageId: string; + /** Delivery attempt count for this consumer group (`Vqs-Delivery-Count`). */ + deliveryCount: number; + /** When the message was enqueued (`Vqs-Timestamp`, ISO 8601). */ + createdAt: string; + /** When the message expires (`Vqs-Expires-At`), if reported. */ + expiresAt?: string; + /** Payload content type (`Content-Type` of the multipart part). */ + contentType: string; + /** Lease handle for this delivery (`Vqs-Receipt-Handle`) — pass to acknowledgeMessage/extendLease. Scoped to the consumer group and delivery. */ + receiptHandle: string; + /** The raw payload bytes of the part. */ + payload: Uint8Array; +} +export const QueueMessage = /*@__PURE__*/ S.suspend(() => + S.Struct({ + messageId: S.String, + deliveryCount: S.Number, + createdAt: S.String, + expiresAt: S.optional(S.String), + contentType: S.String, + receiptHandle: S.String, + payload: S.String, + }), +).annotate({ identifier: "QueueMessage" }) as any as S.Schema; + +export type QueueMessageList = Array; +export const QueueMessageList = /*@__PURE__*/ S.Array( + QueueMessage, +) as any as S.Schema; + +export interface ReceiveMessageByIdResponse { + /** The response's message part(s) — the leased message is the first entry. */ + messages: QueueMessageList; +} +export const ReceiveMessageByIdResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + messages: QueueMessageList.pipe(T.MultipartMessages()), + }), +).annotate({ + identifier: "ReceiveMessageByIdResponse", +}) as any as S.Schema; + +export interface ReceiveMessagesRequest { + /** Region host label, e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host. */ + region: string; + /** OIDC bearer token. */ + token: string | Redacted.Redacted; + /** Topic (queue) name. */ + topic: string; + /** Consumer group to lease under. */ + consumerGroup: string; + /** Deployment partition pin (`Vqs-Deployment-Id`). */ + deploymentId?: string; + /** Lease duration (`Vqs-Visibility-Timeout-Seconds`). */ + visibilityTimeoutSeconds?: number; + /** Batch size, 1–10 (`Vqs-Max-Messages`). */ + maxMessages?: number; +} +export const ReceiveMessagesRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + region: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + topic: S.String.pipe(T.Label()), + consumerGroup: S.String.pipe(T.Label()), + deploymentId: S.optional(S.String.pipe(T.Header("Vqs-Deployment-Id"))), + visibilityTimeoutSeconds: S.optional( + S.Number.pipe(T.Header("Vqs-Visibility-Timeout-Seconds")), + ), + maxMessages: S.optional(S.Number.pipe(T.Header("Vqs-Max-Messages"))), + }).pipe( + T.Http({ + method: "POST", + uri: "/api/v3/topic/{topic}/consumer/{consumerGroup}", + code: 200, + accept: "multipart/mixed", + }), + ), +).annotate({ + identifier: "ReceiveMessagesRequest", +}) as any as S.Schema; + +export interface ReceiveMessagesResponse { + /** The leased batch — empty on a 204 (nothing available). Parts missing required `Vqs-*` headers are skipped (they stay leased and expire back). */ + messages: QueueMessageList; +} +export const ReceiveMessagesResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + messages: QueueMessageList.pipe(T.MultipartMessages()), + }), +).annotate({ + identifier: "ReceiveMessagesResponse", +}) as any as S.Schema; + +export interface SendMessageRequest { + /** Region host label (`https://{region}.vercel-queue.com`), e.g. `iad1`. Ignored while VERCEL_QUEUE_BASE_URL overrides the host. */ + region: string; + /** OIDC bearer token. */ + token: string | Redacted.Redacted; + /** Topic (queue) name. */ + topic: string; + /** Deployment partition pin (`Vqs-Deployment-Id`). Load-bearing: visibility is partitioned by it — unpinned sends are invisible to pinned receivers and vice versa. */ + deploymentId?: string; + /** Payload content type — echoed back on delivery. */ + contentType: string; + /** Dedupe key (`Vqs-Idempotency-Key`) — a reuse fails with the typed DuplicateMessage. */ + idempotencyKey?: string; + /** Message retention (`Vqs-Retention-Seconds`). */ + retentionSeconds?: number; + /** Delivery delay (`Vqs-Delay-Seconds`). */ + delaySeconds?: number; + /** The message payload — sent verbatim as the request body. */ + payload: Blob | Uint8Array | ArrayBuffer | string; +} +export const SendMessageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + region: S.String.pipe(T.HostLabel()), + token: S.String.pipe(T.Header("authorization"), T.SensitiveValue({})), + topic: S.String.pipe(T.Label()), + deploymentId: S.optional(S.String.pipe(T.Header("Vqs-Deployment-Id"))), + contentType: S.String.pipe(T.Header("content-type")), + idempotencyKey: S.optional(S.String.pipe(T.Header("Vqs-Idempotency-Key"))), + retentionSeconds: S.optional( + S.Number.pipe(T.Header("Vqs-Retention-Seconds")), + ), + delaySeconds: S.optional(S.Number.pipe(T.Header("Vqs-Delay-Seconds"))), + payload: S.String.pipe(T.HttpBody()), + }).pipe(T.Http({ method: "POST", uri: "/api/v3/topic/{topic}", code: 200 })), +).annotate({ + identifier: "SendMessageRequest", +}) as any as S.Schema; + +export interface SendMessageResponse { + /** The enqueued message's id. A 202 response carries no id (absent). */ + messageId?: string; +} +export const SendMessageResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + messageId: S.optional(S.String), + }), +).annotate({ + identifier: "SendMessageResponse", +}) as any as S.Schema; + +export type AcknowledgeMessageError = + | MessageNotFound + | MessageNotAvailable + | QueueBadRequest + | QueueUnauthorized + | QueueForbidden + | VercelDataOpError; +/** Acknowledge (complete) a delivery: DELETE the lease. */ +export const acknowledgeMessage: API.OperationMethod< + AcknowledgeMessageRequest, + AcknowledgeMessageResponse, + AcknowledgeMessageError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: AcknowledgeMessageRequest, + output: AcknowledgeMessageResponse, + errors: [ + MessageNotFound, + MessageNotAvailable, + QueueBadRequest, + QueueUnauthorized, + QueueForbidden, + ], + protocol: QueuesDataProtocol, + retry: Retry.Retry, +})); + +export type ExtendLeaseError = + | MessageNotFound + | MessageNotAvailable + | QueueBadRequest + | QueueUnauthorized + | QueueForbidden + | VercelDataOpError; +/** Extend a delivery's visibility timeout: PATCH the lease with `{visibilityTimeoutSeconds}`. */ +export const extendLease: API.OperationMethod< + ExtendLeaseRequest, + ExtendLeaseResponse, + ExtendLeaseError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ExtendLeaseRequest, + output: ExtendLeaseResponse, + errors: [ + MessageNotFound, + MessageNotAvailable, + QueueBadRequest, + QueueUnauthorized, + QueueForbidden, + ], + protocol: QueuesDataProtocol, + retry: Retry.Retry, +})); + +export type ReceiveMessageByIdError = + | MessageNotFound + | MessageNotAvailable + | MessageAlreadyProcessed + | QueueBadRequest + | QueueUnauthorized + | QueueForbidden + | VercelDataOpError; +/** Lease one specific message by id (Accept: multipart/mixed). */ +export const receiveMessageById: API.OperationMethod< + ReceiveMessageByIdRequest, + ReceiveMessageByIdResponse, + ReceiveMessageByIdError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ReceiveMessageByIdRequest, + output: ReceiveMessageByIdResponse, + errors: [ + MessageNotFound, + MessageNotAvailable, + MessageAlreadyProcessed, + QueueBadRequest, + QueueUnauthorized, + QueueForbidden, + ], + protocol: QueuesDataProtocol, + retry: Retry.Retry, +})); + +export type ReceiveMessagesError = + | QueueBadRequest + | QueueUnauthorized + | QueueForbidden + | VercelDataOpError; +/** Lease a batch: `POST /api/v3/topic/{topic}/consumer/{consumerGroup}` (Accept: multipart/mixed). The multipart parts are parsed into typed message records; 204 → empty batch. */ +export const receiveMessages: API.OperationMethod< + ReceiveMessagesRequest, + ReceiveMessagesResponse, + ReceiveMessagesError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ReceiveMessagesRequest, + output: ReceiveMessagesResponse, + errors: [QueueBadRequest, QueueUnauthorized, QueueForbidden], + protocol: QueuesDataProtocol, + retry: Retry.Retry, +})); + +export type SendMessageError = + | DuplicateMessage + | ConsumerDiscoveryFailed + | ConsumerRegistryNotConfigured + | QueueBadRequest + | QueueUnauthorized + | QueueForbidden + | VercelDataOpError; +/** Enqueue one message: `POST /api/v3/topic/{topic}` with the payload as the raw body and delivery options as `Vqs-*` headers. */ +export const sendMessage: API.OperationMethod< + SendMessageRequest, + SendMessageResponse, + SendMessageError, + VercelDataOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: SendMessageRequest, + output: SendMessageResponse, + errors: [ + DuplicateMessage, + ConsumerDiscoveryFailed, + ConsumerRegistryNotConfigured, + QueueBadRequest, + QueueUnauthorized, + QueueForbidden, + ], + protocol: QueuesDataProtocol, + retry: Retry.Retry, +})); diff --git a/packages/vercel/src/services/rolling_release.ts b/packages/vercel/src/services/rolling_release.ts index 98a658ffa..d5c3006c3 100644 --- a/packages/vercel/src/services/rolling_release.ts +++ b/packages/vercel/src/services/rolling_release.ts @@ -1621,6 +1621,26 @@ export const StartRollingReleaseResponse = /*@__PURE__*/ S.suspend(() => identifier: "StartRollingReleaseResponse", }) as any as S.Schema; +/** How the rollout advances between stages: `automatic` (per-stage duration) or `manual-approval`. */ +export type UpdateRollingReleaseConfigRequestAdvancementType = + | "automatic" + | "manual-approval"; +export const UpdateRollingReleaseConfigRequestAdvancementType = + /*@__PURE__*/ S.String; + +export type UpdateRollingReleaseConfigRequestStagesItem = + GetRollingReleaseConfigResponseRollingReleaseStagesItem; +export const UpdateRollingReleaseConfigRequestStagesItem = + GetRollingReleaseConfigResponseRollingReleaseStagesItem; + +/** An array of all the stages required during a deployment release. The final stage must have targetPercentage: 100. */ +export type UpdateRollingReleaseConfigRequestStagesList = + Array; +export const UpdateRollingReleaseConfigRequestStagesList = + /*@__PURE__*/ S.Array( + GetRollingReleaseConfigResponseRollingReleaseStagesItem, + ) as any as S.Schema; + export interface UpdateRollingReleaseConfigRequest { /** Project ID or project name (URL-encoded) */ idOrName: string; @@ -1628,12 +1648,28 @@ export interface UpdateRollingReleaseConfigRequest { teamId?: string; /** The Team slug to perform the request on behalf of. */ slug?: string; + /** Whether rolling releases are enabled for the project. `false` clears the configuration (equivalent to DELETE). */ + enabled: boolean; + /** How the rollout advances between stages: `automatic` (per-stage duration) or `manual-approval`. */ + advancementType?: + | UpdateRollingReleaseConfigRequestAdvancementType + | (string & {}); + /** An array of all the stages required during a deployment release. The final stage must have targetPercentage: 100. */ + stages?: UpdateRollingReleaseConfigRequestStagesList; + /** Whether requests served by the canary deployment should return a header indicating a canary was served. */ + canaryResponseHeader?: boolean; } export const UpdateRollingReleaseConfigRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ idOrName: S.String.pipe(T.Label()), teamId: S.optional(S.String.pipe(T.Query())), slug: S.optional(S.String.pipe(T.Query())), + enabled: S.Boolean, + advancementType: S.optional( + UpdateRollingReleaseConfigRequestAdvancementType, + ), + stages: S.optional(UpdateRollingReleaseConfigRequestStagesList), + canaryResponseHeader: S.optional(S.Boolean), }).pipe( T.Http({ method: "PATCH", diff --git a/packages/vercel/src/services/storage.ts b/packages/vercel/src/services/storage.ts index 3c1779590..9939f93c3 100644 --- a/packages/vercel/src/services/storage.ts +++ b/packages/vercel/src/services/storage.ts @@ -57,6 +57,61 @@ export class PaymentRequired [{ status: 402 }], ) {} +export type CreateStorageStoreConnectionRequestEnvVarEnvironmentsItem = + | "development" + | "preview" + | "production"; +export const CreateStorageStoreConnectionRequestEnvVarEnvironmentsItem = + /*@__PURE__*/ S.String; + +export type CreateStorageStoreConnectionRequestEnvVarEnvironmentsList = Array< + CreateStorageStoreConnectionRequestEnvVarEnvironmentsItem | (string & {}) +>; +export const CreateStorageStoreConnectionRequestEnvVarEnvironmentsList = + /*@__PURE__*/ S.Array( + CreateStorageStoreConnectionRequestEnvVarEnvironmentsItem, + ) as any as S.Schema; + +export type CreateStorageStoreConnectionRequestType = "integration"; +export const CreateStorageStoreConnectionRequestType = /*@__PURE__*/ S.String; + +export interface CreateStorageStoreConnectionRequest { + storeId: string; + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; + projectId: string; + envVarEnvironments: CreateStorageStoreConnectionRequestEnvVarEnvironmentsList; + type: CreateStorageStoreConnectionRequestType | (string & {}); +} +export const CreateStorageStoreConnectionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + storeId: S.String.pipe(T.Label()), + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), + projectId: S.String, + envVarEnvironments: + CreateStorageStoreConnectionRequestEnvVarEnvironmentsList, + type: CreateStorageStoreConnectionRequestType, + }).pipe( + T.Http({ + method: "POST", + uri: "/v1/storage/stores/{storeId}/connections", + code: 200, + }), + ), +).annotate({ + identifier: "CreateStorageStoreConnectionRequest", +}) as any as S.Schema; + +export interface CreateStorageStoreConnectionResponse {} +export const CreateStorageStoreConnectionResponse = /*@__PURE__*/ S.suspend( + () => S.Struct({}), +).annotate({ + identifier: "CreateStorageStoreConnectionResponse", +}) as any as S.Schema; + export type CreateStorageStoresBlobRequestRegion = | "arn1" | "bom1" @@ -84,6 +139,10 @@ export type CreateStorageStoresBlobRequestAccess = "public" | "private"; export const CreateStorageStoresBlobRequestAccess = /*@__PURE__*/ S.String; export interface CreateStorageStoresBlobRequest { + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; name: string; region?: CreateStorageStoresBlobRequestRegion | (string & {}); access?: CreateStorageStoresBlobRequestAccess | (string & {}); @@ -91,6 +150,8 @@ export interface CreateStorageStoresBlobRequest { } export const CreateStorageStoresBlobRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), name: S.String, region: S.optional(CreateStorageStoresBlobRequestRegion), access: S.optional(CreateStorageStoresBlobRequestAccess), @@ -417,6 +478,12 @@ export interface CreateStorageStoresBlobResponseStore { count: number; region: CreateStorageStoresBlobResponseStoreRegion; isTokenExpired: boolean; + id: string; + name: string; + type: string; + createdAt?: number; + updatedAt?: number; + billingState?: string; } export const CreateStorageStoresBlobResponseStore = /*@__PURE__*/ S.suspend( () => @@ -436,6 +503,12 @@ export const CreateStorageStoresBlobResponseStore = /*@__PURE__*/ S.suspend( count: S.Number, region: CreateStorageStoresBlobResponseStoreRegion, isTokenExpired: S.Boolean, + id: S.String, + name: S.String, + type: S.String, + createdAt: S.optional(S.Number), + updatedAt: S.optional(S.Number), + billingState: S.optional(S.String), }), ).annotate({ identifier: "CreateStorageStoresBlobResponseStore", @@ -452,12 +525,50 @@ export const CreateStorageStoresBlobResponse = /*@__PURE__*/ S.suspend(() => identifier: "CreateStorageStoresBlobResponse", }) as any as S.Schema; +export interface DeleteStorageStoreConnectionRequest { + storeId: string; + connectionId: string; + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; +} +export const DeleteStorageStoreConnectionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + storeId: S.String.pipe(T.Label()), + connectionId: S.String.pipe(T.Label()), + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), + }).pipe( + T.Http({ + method: "DELETE", + uri: "/v1/storage/stores/{storeId}/connections/{connectionId}", + code: 200, + }), + ), +).annotate({ + identifier: "DeleteStorageStoreConnectionRequest", +}) as any as S.Schema; + +export interface DeleteStorageStoreConnectionResponse {} +export const DeleteStorageStoreConnectionResponse = /*@__PURE__*/ S.suspend( + () => S.Struct({}), +).annotate({ + identifier: "DeleteStorageStoreConnectionResponse", +}) as any as S.Schema; + export interface DeleteStorageStoresBlobByIdRequest { id: string; + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; } export const DeleteStorageStoresBlobByIdRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ id: S.String.pipe(T.Label()), + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), }).pipe( T.Http({ method: "DELETE", uri: "/storage/stores/blob/{id}", code: 200 }), ), @@ -476,16 +587,182 @@ export const DeleteStorageStoresBlobByIdResponse = /*@__PURE__*/ S.suspend(() => identifier: "DeleteStorageStoresBlobByIdResponse", }) as any as S.Schema; +export interface GetStorageStoreConnectionsRequest { + storeId: string; + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; +} +export const GetStorageStoreConnectionsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + storeId: S.String.pipe(T.Label()), + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), + }).pipe( + T.Http({ + method: "GET", + uri: "/v1/storage/stores/{storeId}/connections", + code: 200, + }), + ), +).annotate({ + identifier: "GetStorageStoreConnectionsRequest", +}) as any as S.Schema; + +export interface GetStorageStoreConnectionsResponseConnectionsItemProject { + id: string; + name: string; +} +export const GetStorageStoreConnectionsResponseConnectionsItemProject = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + name: S.String, + }), + ).annotate({ + identifier: "GetStorageStoreConnectionsResponseConnectionsItemProject", + }) as any as S.Schema; + +export type GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsItem = + "development" | "preview" | "production"; +export const GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsItem = + /*@__PURE__*/ S.String; + +export type GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsList = + Array; +export const GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsList = + /*@__PURE__*/ S.Array( + GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsItem, + ) as any as S.Schema; + +export interface GetStorageStoreConnectionsResponseConnectionsItem { + id: string; + projectId: string; + project?: GetStorageStoreConnectionsResponseConnectionsItemProject; + envVarPrefix?: string | null; + envVarEnvironments: GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsList; +} +export const GetStorageStoreConnectionsResponseConnectionsItem = + /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + projectId: S.String, + project: S.optional( + GetStorageStoreConnectionsResponseConnectionsItemProject, + ), + envVarPrefix: S.optional(S.NullOr(S.String)), + envVarEnvironments: + GetStorageStoreConnectionsResponseConnectionsItemEnvVarEnvironmentsList, + }), + ).annotate({ + identifier: "GetStorageStoreConnectionsResponseConnectionsItem", + }) as any as S.Schema; + +export type GetStorageStoreConnectionsResponseConnectionsList = + Array; +export const GetStorageStoreConnectionsResponseConnectionsList = + /*@__PURE__*/ S.Array( + GetStorageStoreConnectionsResponseConnectionsItem, + ) as any as S.Schema; + +export interface GetStorageStoreConnectionsResponse { + connections: GetStorageStoreConnectionsResponseConnectionsList; +} +export const GetStorageStoreConnectionsResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + connections: GetStorageStoreConnectionsResponseConnectionsList, + }), +).annotate({ + identifier: "GetStorageStoreConnectionsResponse", +}) as any as S.Schema; + +export interface GetStorageStoresRequest { + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; +} +export const GetStorageStoresRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/storage/stores", code: 200 })), +).annotate({ + identifier: "GetStorageStoresRequest", +}) as any as S.Schema; + +export type GetStorageStoresResponseStoresItemAccess = "public" | "private"; +export const GetStorageStoresResponseStoresItemAccess = /*@__PURE__*/ S.String; + +export interface GetStorageStoresResponseStoresItem { + id: string; + ownerId?: string; + createdAt?: number; + updatedAt?: number; + type: string; + name: string; + billingState?: string; + status?: string | null; + region?: string; + access?: GetStorageStoresResponseStoresItemAccess; + size?: number; + count?: number; + isTokenExpired?: boolean; +} +export const GetStorageStoresResponseStoresItem = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + ownerId: S.optional(S.String), + createdAt: S.optional(S.Number), + updatedAt: S.optional(S.Number), + type: S.String, + name: S.String, + billingState: S.optional(S.String), + status: S.optional(S.NullOr(S.String)), + region: S.optional(S.String), + access: S.optional(GetStorageStoresResponseStoresItemAccess), + size: S.optional(S.Number), + count: S.optional(S.Number), + isTokenExpired: S.optional(S.Boolean), + }), +).annotate({ + identifier: "GetStorageStoresResponseStoresItem", +}) as any as S.Schema; + +export type GetStorageStoresResponseStoresList = + Array; +export const GetStorageStoresResponseStoresList = /*@__PURE__*/ S.Array( + GetStorageStoresResponseStoresItem, +) as any as S.Schema; + +export interface GetStorageStoresResponse { + stores: GetStorageStoresResponseStoresList; +} +export const GetStorageStoresResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + stores: GetStorageStoresResponseStoresList, + }), +).annotate({ + identifier: "GetStorageStoresResponse", +}) as any as S.Schema; + export interface GetStorageStoresByIdRequest { id: string; skip_metadata?: boolean; include_guides?: boolean; + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; } export const GetStorageStoresByIdRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ id: S.String.pipe(T.Label()), skip_metadata: S.optional(S.Boolean.pipe(T.Query("skip-metadata"))), include_guides: S.optional(S.Boolean.pipe(T.Query("include-guides"))), + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), }).pipe(T.Http({ method: "GET", uri: "/storage/stores/{id}", code: 200 })), ).annotate({ identifier: "GetStorageStoresByIdRequest", @@ -758,12 +1035,26 @@ export type GetStorageStoresByIdResponseStoreStatus = | "uninstalled"; export const GetStorageStoresByIdResponseStoreStatus = /*@__PURE__*/ S.String; +export type GetStorageStoresByIdResponseStoreAccess = "public" | "private"; +export const GetStorageStoresByIdResponseStoreAccess = /*@__PURE__*/ S.String; + export interface GetStorageStoresByIdResponseStore { projectsMetadata: GetStorageStoresByIdResponseStoreProjectsMetadataList; projectFilter?: GetStorageStoresByIdResponseStoreProjectFilter; totalConnectedProjects?: number; usageQuotaExceeded: boolean; status: GetStorageStoresByIdResponseStoreStatus | null; + id: string; + name: string; + type: string; + createdAt?: number; + updatedAt?: number; + billingState?: string; + region?: string; + access?: GetStorageStoresByIdResponseStoreAccess; + size?: number; + count?: number; + isTokenExpired?: boolean; } export const GetStorageStoresByIdResponseStore = /*@__PURE__*/ S.suspend(() => S.Struct({ @@ -772,6 +1063,17 @@ export const GetStorageStoresByIdResponseStore = /*@__PURE__*/ S.suspend(() => totalConnectedProjects: S.optional(S.Number), usageQuotaExceeded: S.Boolean, status: S.NullOr(GetStorageStoresByIdResponseStoreStatus), + id: S.String, + name: S.String, + type: S.String, + createdAt: S.optional(S.Number), + updatedAt: S.optional(S.Number), + billingState: S.optional(S.String), + region: S.optional(S.String), + access: S.optional(GetStorageStoresByIdResponseStoreAccess), + size: S.optional(S.Number), + count: S.optional(S.Number), + isTokenExpired: S.optional(S.Boolean), }), ).annotate({ identifier: "GetStorageStoresByIdResponseStore", @@ -788,6 +1090,26 @@ export const GetStorageStoresByIdResponse = /*@__PURE__*/ S.suspend(() => identifier: "GetStorageStoresByIdResponse", }) as any as S.Schema; +export type CreateStorageStoreConnectionError = + | BadRequest + | PaymentRequired + | Forbidden + | NotFound + | VercelOpError; +/** Connect a store to a project Connect a storage store to a project. Injects the store's token env var (e.g. BLOB_READ_WRITE_TOKEN) into the project for the chosen environments. */ +export const createStorageStoreConnection: API.OperationMethod< + CreateStorageStoreConnectionRequest, + CreateStorageStoreConnectionResponse, + CreateStorageStoreConnectionError, + VercelOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: CreateStorageStoreConnectionRequest, + output: CreateStorageStoreConnectionResponse, + errors: [BadRequest, PaymentRequired, Forbidden, NotFound], + protocol: VercelProtocol, + retry: Retry.Retry, +})); + export type CreateStorageStoresBlobError = | BadRequest | PaymentRequired @@ -809,6 +1131,25 @@ export const createStorageStoresBlob: API.OperationMethod< retry: Retry.Retry, })); +export type DeleteStorageStoreConnectionError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; +/** Disconnect a store from a project Disconnect a storage store from a project. Also removes the env var the connection injected into the project. */ +export const deleteStorageStoreConnection: API.OperationMethod< + DeleteStorageStoreConnectionRequest, + DeleteStorageStoreConnectionResponse, + DeleteStorageStoreConnectionError, + VercelOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteStorageStoreConnectionRequest, + output: DeleteStorageStoreConnectionResponse, + errors: [BadRequest, Forbidden, NotFound], + protocol: VercelProtocol, + retry: Retry.Retry, +})); + export type DeleteStorageStoresBlobByIdError = | BadRequest | Forbidden @@ -829,6 +1170,40 @@ export const deleteStorageStoresBlobById: API.OperationMethod< retry: Retry.Retry, })); +export type GetStorageStoreConnectionsError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; +/** List store connections List the projects connected to a storage store. */ +export const getStorageStoreConnections: API.OperationMethod< + GetStorageStoreConnectionsRequest, + GetStorageStoreConnectionsResponse, + GetStorageStoreConnectionsError, + VercelOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetStorageStoreConnectionsRequest, + output: GetStorageStoreConnectionsResponse, + errors: [BadRequest, Forbidden, NotFound], + protocol: VercelProtocol, + retry: Retry.Retry, +})); + +export type GetStorageStoresError = BadRequest | Forbidden | VercelOpError; +/** List stores List every storage store (all types: blob, edge-config, ...) on the account or team. */ +export const getStorageStores: API.OperationMethod< + GetStorageStoresRequest, + GetStorageStoresResponse, + GetStorageStoresError, + VercelOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetStorageStoresRequest, + output: GetStorageStoresResponse, + errors: [BadRequest, Forbidden], + protocol: VercelProtocol, + retry: Retry.Retry, +})); + export type GetStorageStoresByIdError = | BadRequest | Forbidden diff --git a/packages/vercel/src/services/teams.ts b/packages/vercel/src/services/teams.ts index a6afb217d..922444690 100644 --- a/packages/vercel/src/services/teams.ts +++ b/packages/vercel/src/services/teams.ts @@ -2255,7 +2255,7 @@ export const GetTeamsResponse = /*@__PURE__*/ S.suspend(() => }) as any as S.Schema; /** The role of the user to invite */ -export type InviteUserToTeamRequestBodyItemRole = +export type InviteUserToTeamRequestRole = | "OWNER" | "MEMBER" | "DEVELOPER" @@ -2264,75 +2264,55 @@ export type InviteUserToTeamRequestBodyItemRole = | "VIEWER" | "VIEWER_FOR_PLUS" | "CONTRIBUTOR"; -export const InviteUserToTeamRequestBodyItemRole = /*@__PURE__*/ S.String; +export const InviteUserToTeamRequestRole = /*@__PURE__*/ S.String; /** Sets the project roles for the invited user */ -export type InviteUserToTeamRequestBodyItemProjectsItemRole = +export type InviteUserToTeamRequestProjectsItemRole = | "ADMIN" | "PROJECT_VIEWER" | "PROJECT_DEVELOPER" | "PROJECT_GUEST"; -export const InviteUserToTeamRequestBodyItemProjectsItemRole = - /*@__PURE__*/ S.String; +export const InviteUserToTeamRequestProjectsItemRole = /*@__PURE__*/ S.String; -export interface InviteUserToTeamRequestBodyItemProjectsItem { +export interface InviteUserToTeamRequestProjectsItem { /** The ID of the project. */ projectId: string; /** Sets the project roles for the invited user */ - role: InviteUserToTeamRequestBodyItemProjectsItemRole | (string & {}); -} -export const InviteUserToTeamRequestBodyItemProjectsItem = - /*@__PURE__*/ S.suspend(() => - S.Struct({ - projectId: S.String, - role: InviteUserToTeamRequestBodyItemProjectsItemRole, - }), - ).annotate({ - identifier: "InviteUserToTeamRequestBodyItemProjectsItem", - }) as any as S.Schema; - -export type InviteUserToTeamRequestBodyItemProjectsList = - Array; -export const InviteUserToTeamRequestBodyItemProjectsList = - /*@__PURE__*/ S.Array( - InviteUserToTeamRequestBodyItemProjectsItem, - ) as any as S.Schema; - -export interface InviteUserToTeamRequestBodyItem { - /** The email address of the user to invite */ - email: string; - /** The role of the user to invite */ - role?: InviteUserToTeamRequestBodyItemRole | (string & {}); - projects?: InviteUserToTeamRequestBodyItemProjectsList; + role: InviteUserToTeamRequestProjectsItemRole | (string & {}); } -export const InviteUserToTeamRequestBodyItem = /*@__PURE__*/ S.suspend(() => +export const InviteUserToTeamRequestProjectsItem = /*@__PURE__*/ S.suspend(() => S.Struct({ - email: S.String, - role: S.optional(InviteUserToTeamRequestBodyItemRole), - projects: S.optional(InviteUserToTeamRequestBodyItemProjectsList), + projectId: S.String, + role: InviteUserToTeamRequestProjectsItemRole, }), ).annotate({ - identifier: "InviteUserToTeamRequestBodyItem", -}) as any as S.Schema; + identifier: "InviteUserToTeamRequestProjectsItem", +}) as any as S.Schema; -export type InviteUserToTeamRequestBodyList = - Array; -export const InviteUserToTeamRequestBodyList = /*@__PURE__*/ S.Array( - InviteUserToTeamRequestBodyItem, -) as any as S.Schema; +export type InviteUserToTeamRequestProjectsList = + Array; +export const InviteUserToTeamRequestProjectsList = /*@__PURE__*/ S.Array( + InviteUserToTeamRequestProjectsItem, +) as any as S.Schema; export interface InviteUserToTeamRequest { /** The Team identifier to perform the request on behalf of. */ teamId: string; /** The Team slug to perform the request on behalf of. */ slug?: string; - body?: InviteUserToTeamRequestBodyList; + /** The email address of the user to invite */ + email: string; + /** The role of the user to invite */ + role?: InviteUserToTeamRequestRole | (string & {}); + projects?: InviteUserToTeamRequestProjectsList; } export const InviteUserToTeamRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ teamId: S.String.pipe(T.Label()), slug: S.optional(S.String.pipe(T.Query())), - body: S.optional(InviteUserToTeamRequestBodyList.pipe(T.HttpBody())), + email: S.String, + role: S.optional(InviteUserToTeamRequestRole), + projects: S.optional(InviteUserToTeamRequestProjectsList), }).pipe( T.Http({ method: "POST", uri: "/v2/teams/{teamId}/members", code: 200 }), ), @@ -3744,6 +3724,7 @@ export type DeleteTeamError = | BadRequest | PaymentRequired | Forbidden + | NotFound | Conflict | VercelOpError; /** Delete a Team Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. */ @@ -3755,7 +3736,7 @@ export const deleteTeam: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: DeleteTeamRequest, output: DeleteTeamResponse, - errors: [BadRequest, PaymentRequired, Forbidden, Conflict], + errors: [BadRequest, PaymentRequired, Forbidden, NotFound, Conflict], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/web_analytics.ts b/packages/vercel/src/services/web_analytics.ts index 5761bfedc..45e515a69 100644 --- a/packages/vercel/src/services/web_analytics.ts +++ b/packages/vercel/src/services/web_analytics.ts @@ -30,6 +30,15 @@ export class Forbidden [{ status: 403 }], ) {} +export class NotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("NotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + export class PaymentRequired extends /*@__PURE__*/ T.applyErrorMatchers( /*@__PURE__*/ S.TaggedError()("PaymentRequired", { @@ -1436,11 +1445,17 @@ export const CreateSpeedInsightsToggleResponse = /*@__PURE__*/ S.suspend(() => export interface CreateWebInsightsToggleRequest { projectId: string; + /** The Team identifier to perform the request on behalf of. */ + teamId?: string; + /** The Team slug to perform the request on behalf of. */ + slug?: string; value: boolean; } export const CreateWebInsightsToggleRequest = /*@__PURE__*/ S.suspend(() => S.Struct({ projectId: S.String.pipe(T.Query()), + teamId: S.optional(S.String.pipe(T.Query())), + slug: S.optional(S.String.pipe(T.Query())), value: S.Boolean, }).pipe(T.Http({ method: "POST", uri: "/web/insights/toggle", code: 200 })), ).annotate({ @@ -1555,6 +1570,7 @@ export const createSpeedInsightsToggle: API.OperationMethod< export type CreateWebInsightsToggleError = | BadRequest | Forbidden + | NotFound | VercelOpError; export const createWebInsightsToggle: API.OperationMethod< CreateWebInsightsToggleRequest, @@ -1564,7 +1580,7 @@ export const createWebInsightsToggle: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: CreateWebInsightsToggleRequest, output: CreateWebInsightsToggleResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/services/webhooks.ts b/packages/vercel/src/services/webhooks.ts index fd940b673..73ba1a906 100644 --- a/packages/vercel/src/services/webhooks.ts +++ b/packages/vercel/src/services/webhooks.ts @@ -31,6 +31,15 @@ export class Forbidden [{ status: 403 }], ) {} +export class NotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("NotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + export type CreateWebhookRequestEventsItem = | "budget.reached" | "domain.created" @@ -1027,7 +1036,11 @@ export const createWebhook: API.OperationMethod< retry: Retry.Retry, })); -export type DeleteWebhookError = BadRequest | Forbidden | VercelOpError; +export type DeleteWebhookError = + | BadRequest + | Forbidden + | NotFound + | VercelOpError; /** Deletes a webhook Deletes a webhook */ export const deleteWebhook: API.OperationMethod< DeleteWebhookRequest, @@ -1037,12 +1050,12 @@ export const deleteWebhook: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: DeleteWebhookRequest, output: DeleteWebhookResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); -export type GetWebhookError = BadRequest | Forbidden | VercelOpError; +export type GetWebhookError = BadRequest | Forbidden | NotFound | VercelOpError; /** Get a webhook Get a webhook */ export const getWebhook: API.OperationMethod< GetWebhookRequest, @@ -1052,7 +1065,7 @@ export const getWebhook: API.OperationMethod< > = /*@__PURE__*/ API.make(() => ({ input: GetWebhookRequest, output: GetWebhookResponse, - errors: [BadRequest, Forbidden], + errors: [BadRequest, Forbidden, NotFound], protocol: VercelProtocol, retry: Retry.Retry, })); diff --git a/packages/vercel/src/traits.ts b/packages/vercel/src/traits.ts index 0194805e8..fca026a9d 100644 --- a/packages/vercel/src/traits.ts +++ b/packages/vercel/src/traits.ts @@ -2,14 +2,17 @@ * Vercel SDK trait surface — hand-written. * * Re-exports the generic protocol traits from core so generated operations - * import everything from one place. Vercel speaks plain bearer-REST JSON with - * no success envelope, so there are no provider-specific traits. + * import everything from one place. The management API speaks plain + * bearer-REST JSON with no success envelope; the DATA-PLANE services + * (blob_data / queues_data / edge_config_data, from manual-specs) add two + * provider traits for their non-JSON responses. */ export { Body, Header, Query, Label, + HostLabel, Http, ResponseCode, HttpBody, @@ -18,12 +21,14 @@ export { UnionCases, applyErrorMatchers, getErrorMatchers, + makeAnnotation, type HttpTrait, type ErrorMatcher, bodySymbol, headerSymbol, querySymbol, labelSymbol, + hostLabelSymbol, httpSymbol, responseCodeSymbol, httpBodySymbol, @@ -32,6 +37,33 @@ export { unionCasesSymbol, errorMatchersSymbol, } from "@distilled.cloud/core/trait"; +import { makeAnnotation as make } from "@distilled.cloud/core/trait"; + +/** + * Raw binary response body (data-plane blob content reads): the response + * body is delivered as buffered bytes on this output member instead of + * being decoded as JSON; sibling `Header()` members project response + * headers. Mirrors `com.vercel.protocols#binaryResponseBody` in the manual + * Smithy models. + */ +export type BinaryResponseBody = Uint8Array; +export const binaryResponseBodySymbol = Symbol.for( + "@distilled.cloud/vercel/binary-response-body", +); +export const BinaryResponseBody = (_value?: unknown) => + make(binaryResponseBodySymbol, true); + +/** + * Multipart/mixed message batch (queues data-plane receives): the response + * is parsed into one record per part — `Vqs-*` part headers become fields, + * the part body becomes `payload` bytes. Mirrors + * `com.vercel.protocols#multipartMessages` in the manual Smithy models. + */ +export const multipartMessagesSymbol = Symbol.for( + "@distilled.cloud/vercel/multipart-messages", +); +export const MultipartMessages = (_value?: unknown) => + make(multipartMessagesSymbol, true); // Bearer-REST protocol traits (sensitive strings, bare-payload responses). export {