From b534dc478de211a667b652cb5f7a022591ac0706 Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 08:09:51 -0300 Subject: [PATCH 1/8] feat(typespec): add TypeSpec models for Storage, Functions, and PostgREST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parallel to the Smithy models in smithy/ — same APIs, different IDL — for comparing the two as source-of-truth candidates for SDK codegen. Key differences from Smithy output: - Explicit application/octet-stream content-type on binary bodies (TUS chunk, Functions invoke) via @header contentType, producing format: binary in OpenAPI instead of Smithy's format: byte (which required patch-openapi.py to fix) - PostgREST row bodies use `unknown` (maps to {} in JSON Schema — any JSON value) instead of bytes/format: byte, accurately representing user-defined row structures - Dynamic query params use @query(#{explode: true}) so each PostgREST filter becomes its own query parameter (?select=*&id=eq.5) rather than a single packed value - Integer fields emit int32/int64 formats; Smithy emits generic number - Void responses use 204 No Content; Smithy emits 200 - Schemas are reused via $ref; Smithy generates per-operation wrapper types Compile: cd typespec && npm install && npx tsp compile . Output: typespec/openapi/@typespec/openapi3/ --- typespec/.gitignore | 1 + typespec/README.md | 117 + typespec/functions.tsp | 88 + typespec/main.tsp | 3 + .../openapi3/openapi.Supabase.Functions.yaml | 183 ++ .../openapi3/openapi.Supabase.PostgREST.yaml | 344 ++ .../openapi3/openapi.Supabase.Storage.yaml | 723 +++++ typespec/package-lock.json | 2845 +++++++++++++++++ typespec/package.json | 11 + typespec/postgrest.tsp | 131 + typespec/storage.tsp | 280 ++ typespec/tspconfig.yaml | 4 + 12 files changed, 4730 insertions(+) create mode 100644 typespec/.gitignore create mode 100644 typespec/README.md create mode 100644 typespec/functions.tsp create mode 100644 typespec/main.tsp create mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml create mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml create mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml create mode 100644 typespec/package-lock.json create mode 100644 typespec/package.json create mode 100644 typespec/postgrest.tsp create mode 100644 typespec/storage.tsp create mode 100644 typespec/tspconfig.yaml diff --git a/typespec/.gitignore b/typespec/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/typespec/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/typespec/README.md b/typespec/README.md new file mode 100644 index 0000000..91f68cd --- /dev/null +++ b/typespec/README.md @@ -0,0 +1,117 @@ +# Supabase TypeSpec Models + +Canonical [TypeSpec](https://typespec.io/) definitions for the Supabase HTTP APIs — a direct parallel to the Smithy models in `../smithy/` for comparing the two IDLs as source-of-truth candidates for SDK codegen. + +## Structure + +``` +typespec/ + main.tsp # Entry point — imports all service files + storage.tsp # Supabase Storage API (buckets, objects, TUS resumable uploads) + functions.tsp # Supabase Edge Functions API (invoke: GET/POST/PUT/PATCH/DELETE) + postgrest.tsp # Supabase PostgREST API (table CRUD + RPC) + openapi/ + @typespec/openapi3/ # Generated OpenAPI 3.0 — committed for SDK consumers + openapi.Supabase.Storage.yaml + openapi.Supabase.Functions.yaml + openapi.Supabase.PostgREST.yaml + tspconfig.yaml # TypeSpec build config + package.json # TypeSpec compiler + emitter dependencies +``` + +> **Note on output path**: TypeSpec always namespaces emitter output under `{output-dir}/@typespec/openapi3/` to prevent conflicts when multiple emitters share the same output directory. This is intentional but differs from Smithy's flat `openapi/` layout (a tooling ergonomics difference, not a modelling one). + +## Compiling + +**Requirements:** Node.js 18+ + +```bash +cd typespec +npm install +npx tsp compile . # emits openapi/@typespec/openapi3/ from tspconfig.yaml +``` + +The committed files are the direct compiler outputs — no post-generation patching needed (unlike the Smithy equivalents, which require `patch-openapi.py` to fix binary format). + +## Services modelled + +### Storage (`storage.tsp`) + +Covers the full Supabase Storage HTTP API, grouped into TypeSpec interfaces: + +| Interface | Operations | +|-----------|-----------| +| `Buckets` | `list`, `get`, `create`, `update`, `empty`, `delete` | +| `Objects` | `move`, `copy`, `deleteObjects`, `list`, `info`, `head`, `createSignedUrl`, `createSignedUrls`, `createSignedUploadUrl` | +| `TusUploads` | `create` (POST 201), `uploadChunk` (PATCH 204), `getOffset` (HEAD) | + +### Functions (`functions.tsp`) + +One interface `FunctionInvocations` with one operation per HTTP method on `/functions/v1/{functionName}`. + +### PostgREST (`postgrest.tsp`) + +Two interfaces: `TableOperations` (SELECT/INSERT/UPSERT/UPDATE/DELETE on `/{table}`) and `RpcOperations` (`/rpc/{fn}`). Dynamic query params use `Record` — the TypeSpec equivalent of Smithy's `@httpQueryParams map`. + +## Smithy vs TypeSpec comparison + +### Syntax + +| Concern | Smithy | TypeSpec | +|---------|--------|---------| +| Service declaration | `@restJson1 service Foo { operations: [...] }` | `@service namespace Foo;` | +| Operation | `operation Foo { input: ..., output: ... }` | `op foo(...): ReturnType` (inline params) | +| Grouping | Flat list under `service` | `interface` groups (idiomatic, cleaner) | +| Structure | `structure Foo { @required bar: String }` | `model Foo { bar: string }` with `?` for optional | +| Error type | `@error("client") structure FooError` | `@error model FooError` | +| HTTP method | `@http(method: "GET", uri: "/foo", code: 200)` | `@get @route("/foo")` (separate decorators) | +| Path param | `@httpLabel id: String` | `@path id: string` (inline in op params) | +| Header | `@httpHeader("X-Foo") foo: String` | `@header("X-Foo") foo: string` | +| Query params (dynamic) | `@httpQueryParams params: QueryParams` | `@query params?: Record` | +| Payload | `@httpPayload body: Blob` | `@body body: bytes` | +| JSON rename | `@jsonName("public") isPublic: Boolean` | `@encodedName("application/json", "public") isPublic: boolean` | +| Streaming | `@streaming blob ChunkBody` | `bytes` (no streaming annotation; maps to `format: binary`) | + +### Limitations found (TypeSpec) + +| # | Gap | Notes | +|---|-----|-------| +| 1 | No `@streaming` equivalent | `bytes` emits `format: binary` in OpenAPI 3.0 directly — this is actually **better** than Smithy, which emits `format: byte` (base64) and requires `patch-openapi.py` to fix | +| 2 | No native `multipart/form-data` support | Same gap as Smithy; direct upload (`UploadObject`/`UpdateObject`) requires manual OpenAPI injection or a `@typespec/multipart` workaround | +| 3 | Fixed HTTP method per operation | Same constraint as Smithy — Functions needs 5 separate operations | +| 4 | Dynamic query params via `Record` | Smithy uses a dedicated `@httpQueryParams` trait; TypeSpec uses `@query Record` — both generate the same OpenAPI `additionalProperties` pattern | +| 5 | Realtime (WebSocket) | Out of scope in both IDLs | + +### TypeSpec advantages over Smithy + +1. **No patching needed for binary**: `bytes` → `format: binary` in OpenAPI out of the box. Smithy requires `patch-openapi.py` to correct `format: byte`. +2. **Interface grouping**: Operations are organized into `interface`s rather than a flat list under `service`, matching how SDK code is structured. +3. **Inline operation parameters**: `op foo(@path id: string, @body body: Foo): Bar` is more readable than separate `input`/`output` structure declarations. +4. **Native npm ecosystem**: `npm install` + `npx tsp compile` vs Smithy CLI (Java) or Gradle. Easier CI integration, no JVM dependency. +5. **HTTP client emitters**: `@typespec/http-client-js`, `@typespec/http-client-python`, `@typespec/http-client-csharp` are first-party and actively maintained. Smithy's equivalents are AWS-specific or require custom plugins. +6. **TypeScript-native**: TypeSpec is authored in TypeScript, making it easier to write custom emitters (e.g., Swift, Dart, Kotlin) if the first-party ones don't exist. + +### Smithy advantages over TypeSpec + +1. **Maturity**: Smithy has been in production at AWS since ~2019. TypeSpec hit 1.0 in 2025. +2. **`smithy-kotlin`**: First-class Kotlin/KMP emitter from AWS. No TypeSpec equivalent yet. +3. **Explicit semantic traits**: `@readonly`, `@idempotent` carry semantic meaning for SDK generators beyond HTTP. TypeSpec uses `@get`/`@put` which imply but don't enforce these. + +## Generator toolchains by SDK + +| SDK | Smithy path | TypeSpec path | +|-----|-------------|---------------| +| Swift | `swift-openapi-generator` (spike done — [PR #1047](https://github.com/supabase/supabase-swift/pull/1047)) | Same — TypeSpec OpenAPI 3.0 output is compatible | +| JavaScript/TypeScript | `@hey-api/openapi-ts` or `@typespec/http-client-js` | `@typespec/http-client-js` (first-party, compiles directly from `.tsp`) | +| Python | `openapi-python-client` or `@typespec/http-client-python` | `@typespec/http-client-python` (first-party) | +| Dart/Flutter | `openapi-generator dart-dio` | Same — via OpenAPI artifact | +| C# | Kiota or `@typespec/http-client-csharp` | `@typespec/http-client-csharp` (first-party) | +| Go | `oapi-codegen` or `ogen` | Same — via OpenAPI artifact | +| Kotlin | `smithy-kotlin` (best Smithy option) | Via OpenAPI artifact + `openapi-generator kotlin` | + +## Reference + +- RFC: [Auto-generating parts of the Supabase SDKs](https://linear.app/supabase/project/rfc-auto-generating-parts-of-the-supabase-sdks-581579f2a632) +- Smithy models: [`../smithy/`](../smithy/) +- TypeSpec docs: https://typespec.io/docs +- Linear spike issues: SDK-1103 (Swift) · SDK-1104 (JS) · SDK-1105 (Python) · SDK-1106 (Dart) · SDK-1107 (C#) · SDK-1108 (Go) · SDK-1109 (Kotlin) diff --git a/typespec/functions.tsp b/typespec/functions.tsp new file mode 100644 index 0000000..c0aeba6 --- /dev/null +++ b/typespec/functions.tsp @@ -0,0 +1,88 @@ +import "@typespec/http"; +import "@typespec/openapi"; + +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +@service +@info({ + title: "Supabase Edge Functions API", + version: "1.0", +}) +@server("{baseUrl}", "Supabase Edge Functions endpoint", { + baseUrl: string, +}) +namespace Supabase.Functions; + +// ─── Shared Shapes ───────────────────────────────────────────────────────── + +@error +model FunctionsError { + message?: string; +} + +// Explicit content-type on both body and response forces application/octet-stream +// in OpenAPI (TypeSpec defaults bytes to application/json without it). +model OctetStreamResponse { + @statusCode statusCode: 200; + @header contentType: "application/octet-stream"; + @body body: bytes; +} + +// ─── Operations ──────────────────────────────────────────────────────────── +// +// TypeSpec, like Smithy, requires a fixed HTTP method per operation. +// FunctionsClient.invoke() dispatches to the appropriate generated method +// at runtime based on FunctionInvokeOptions.method. +// +// Advantage over Smithy: TypeSpec's interface groups these naturally vs +// Smithy's flat list at the service level. +// +// Known limitation: FunctionInvokeOptions.query (dynamic query params) +// cannot be modelled here — requires middleware URL-rewriting in each SDK. + +@route("/functions/v1") +interface FunctionInvocations { + @get + @route("/{functionName}") + invokeGet( + @path functionName: string, + @header("x-region") region?: string, + ): OctetStreamResponse | FunctionsError; + + @post + @route("/{functionName}") + invokePost( + @path functionName: string, + @header("x-region") region?: string, + @header contentType?: "application/octet-stream", + @body body?: bytes, + ): OctetStreamResponse | FunctionsError; + + @put + @route("/{functionName}") + invokePut( + @path functionName: string, + @header("x-region") region?: string, + @header contentType?: "application/octet-stream", + @body body?: bytes, + ): OctetStreamResponse | FunctionsError; + + @patch + @route("/{functionName}") + invokePatch( + @path functionName: string, + @header("x-region") region?: string, + @header contentType?: "application/octet-stream", + @body body?: bytes, + ): OctetStreamResponse | FunctionsError; + + @delete + @route("/{functionName}") + invokeDelete( + @path functionName: string, + @header("x-region") region?: string, + @header contentType?: "application/octet-stream", + @body body?: bytes, + ): OctetStreamResponse | FunctionsError; +} diff --git a/typespec/main.tsp b/typespec/main.tsp new file mode 100644 index 0000000..e4c6983 --- /dev/null +++ b/typespec/main.tsp @@ -0,0 +1,3 @@ +import "./storage.tsp"; +import "./functions.tsp"; +import "./postgrest.tsp"; diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml new file mode 100644 index 0000000..5cb17ff --- /dev/null +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml @@ -0,0 +1,183 @@ +openapi: 3.0.0 +info: + title: Supabase Edge Functions API + version: '1.0' +tags: [] +paths: + /functions/v1/{functionName}: + get: + operationId: FunctionInvocations_invokeGet + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: x-region + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/octet-stream: + schema: + type: string + format: binary + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionsError' + post: + operationId: FunctionInvocations_invokePost + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: x-region + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/octet-stream: + schema: + type: string + format: binary + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionsError' + requestBody: + required: false + content: + application/octet-stream: + schema: + type: string + format: binary + put: + operationId: FunctionInvocations_invokePut + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: x-region + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/octet-stream: + schema: + type: string + format: binary + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionsError' + requestBody: + required: false + content: + application/octet-stream: + schema: + type: string + format: binary + patch: + operationId: FunctionInvocations_invokePatch + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: x-region + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/octet-stream: + schema: + type: string + format: binary + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionsError' + requestBody: + required: false + content: + application/octet-stream: + schema: + type: string + format: binary + delete: + operationId: FunctionInvocations_invokeDelete + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: x-region + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/octet-stream: + schema: + type: string + format: binary + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionsError' + requestBody: + required: false + content: + application/octet-stream: + schema: + type: string + format: binary +components: + schemas: + FunctionsError: + type: object + properties: + message: + type: string +servers: + - url: '{baseUrl}' + description: Supabase Edge Functions endpoint + variables: + baseUrl: + default: '' diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml new file mode 100644 index 0000000..eb081a3 --- /dev/null +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml @@ -0,0 +1,344 @@ +openapi: 3.0.0 +info: + title: Supabase PostgREST API + version: '1.0' +tags: [] +paths: + /rpc/{functionName}: + post: + operationId: RpcOperations_rpc + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: params + in: query + required: false + schema: + type: object + additionalProperties: + type: string + - name: Prefer + in: header + required: false + schema: + type: string + - name: Content-Profile + in: header + required: false + schema: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' + requestBody: + required: true + content: + application/json: + schema: {} + /{table}: + get: + operationId: TableOperations_from + parameters: + - name: table + in: path + required: true + schema: + type: string + - name: params + in: query + required: false + schema: + type: object + additionalProperties: + type: string + - name: Range + in: header + required: false + schema: + type: string + - name: Prefer + in: header + required: false + schema: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' + post: + operationId: TableOperations_insert + parameters: + - name: table + in: path + required: true + schema: + type: string + - name: params + in: query + required: false + schema: + type: object + additionalProperties: + type: string + - name: Prefer + in: header + required: false + schema: + type: string + - name: Content-Profile + in: header + required: false + schema: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' + requestBody: + required: true + content: + application/json: + schema: {} + put: + operationId: TableOperations_upsert + parameters: + - name: table + in: path + required: true + schema: + type: string + - name: params + in: query + required: false + schema: + type: object + additionalProperties: + type: string + - name: Prefer + in: header + required: false + schema: + type: string + - name: Content-Profile + in: header + required: false + schema: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' + requestBody: + required: true + content: + application/json: + schema: {} + patch: + operationId: TableOperations_update + parameters: + - name: table + in: path + required: true + schema: + type: string + - name: params + in: query + required: false + schema: + type: object + additionalProperties: + type: string + - name: Prefer + in: header + required: false + schema: + type: string + - name: Content-Profile + in: header + required: false + schema: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' + requestBody: + required: true + content: + application/json: + schema: {} + delete: + operationId: TableOperations_deleteRows + parameters: + - name: table + in: path + required: true + schema: + type: string + - name: params + in: query + required: false + schema: + type: object + additionalProperties: + type: string + - name: Prefer + in: header + required: false + schema: + type: string + - name: Content-Profile + in: header + required: false + schema: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' +components: + schemas: + PostgRESTError: + type: object + properties: + message: + type: string + code: + type: string + details: + type: string + hint: + type: string +servers: + - url: '{baseUrl}' + description: Supabase PostgREST endpoint + variables: + baseUrl: + default: '' diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml new file mode 100644 index 0000000..758d1f6 --- /dev/null +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml @@ -0,0 +1,723 @@ +openapi: 3.0.0 +info: + title: Supabase Storage API + version: '1.0' +tags: [] +paths: + /bucket: + get: + operationId: Buckets_list + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Bucket' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + post: + operationId: Buckets_create + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateBucketInput' + /bucket/{id}: + get: + operationId: Buckets_get + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/Bucket' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + put: + operationId: Buckets_update + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateBucketInput' + delete: + operationId: Buckets_deleteBucket + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + /bucket/{id}/empty: + post: + operationId: Buckets_empty + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + /object/copy: + post: + operationId: Objects_copy + parameters: [] + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/CopyObjectOutput' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CopyObjectInput' + /object/info/{bucketId}/{wildcardPath}: + get: + operationId: Objects_info + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + - name: wildcardPath + in: path + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/FileInfo' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + /object/list/{bucketId}: + post: + operationId: Objects_list + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/FileObject' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ListObjectsInput' + /object/move: + post: + operationId: Objects_move + parameters: [] + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MoveObjectInput' + /object/sign/{bucketId}: + post: + operationId: Objects_createSignedUrls + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/SignedUrlResult' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSignedUrlsInput' + /object/sign/{bucketId}/{wildcardPath}: + post: + operationId: Objects_createSignedUrl + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + - name: wildcardPath + in: path + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSignedUrlOutput' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSignedUrlInput' + /object/upload/sign/{bucketId}/{wildcardPath}: + post: + operationId: Objects_createSignedUploadUrl + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + - name: wildcardPath + in: path + required: true + schema: + type: string + - name: x-upsert + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSignedUploadUrlOutput' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + /object/{bucketId}: + delete: + operationId: Objects_deleteObjects + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/FileObject' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + prefixes: + type: array + items: + type: string + required: + - prefixes + /object/{bucketId}/{wildcardPath}: + head: + operationId: Objects_head + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + - name: wildcardPath + in: path + required: true + schema: + type: string + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + /upload/resumable: + post: + operationId: TusUploads_create + parameters: + - name: Upload-Length + in: header + required: true + schema: + type: integer + format: int64 + - name: Upload-Metadata + in: header + required: true + schema: + type: string + - name: Tus-Resumable + in: header + required: true + schema: + type: string + - name: x-upsert + in: header + required: false + schema: + type: string + responses: + '201': + description: The request has succeeded and a new resource has been created as a result. + headers: + location: + required: true + schema: + type: string + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + /upload/resumable/{uploadId}: + patch: + operationId: TusUploads_uploadChunk + parameters: + - name: uploadId + in: path + required: true + schema: + type: string + - name: Upload-Offset + in: header + required: true + schema: + type: integer + format: int64 + - name: Tus-Resumable + in: header + required: true + schema: + type: string + responses: + '204': + description: 'There is no content to send for this request, but the headers may be useful. ' + headers: + Upload-Offset: + required: true + schema: + type: integer + format: int64 + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + application/octet-stream: + schema: + type: string + format: binary + head: + operationId: TusUploads_getOffset + parameters: + - name: uploadId + in: path + required: true + schema: + type: string + - name: Tus-Resumable + in: header + required: true + schema: + type: string + responses: + '200': + description: The request has succeeded. + headers: + Upload-Offset: + required: true + schema: + type: integer + format: int64 + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' +components: + schemas: + Bucket: + type: object + required: + - id + - name + - public + properties: + id: + type: string + name: + type: string + public: + type: boolean + file_size_limit: + type: integer + format: int64 + allowed_mime_types: + type: array + items: + type: string + created_at: + type: string + updated_at: + type: string + CopyObjectInput: + type: object + required: + - bucketId + - sourceKey + - destinationKey + properties: + bucketId: + type: string + sourceKey: + type: string + destinationKey: + type: string + destinationBucket: + type: string + CopyObjectOutput: + type: object + required: + - Key + properties: + Key: + type: string + CreateBucketInput: + type: object + required: + - id + - name + - public + properties: + id: + type: string + name: + type: string + public: + type: boolean + file_size_limit: + type: integer + format: int64 + allowed_mime_types: + type: array + items: + type: string + CreateSignedUploadUrlOutput: + type: object + required: + - url + properties: + url: + type: string + CreateSignedUrlInput: + type: object + required: + - expiresIn + properties: + expiresIn: + type: integer + format: int32 + CreateSignedUrlOutput: + type: object + required: + - signedURL + properties: + signedURL: + type: string + CreateSignedUrlsInput: + type: object + required: + - expiresIn + - paths + properties: + expiresIn: + type: integer + format: int32 + paths: + type: array + items: + type: string + FileInfo: + type: object + properties: + eTag: + type: string + size: + type: integer + format: int64 + mimetype: + type: string + cacheControl: + type: string + lastModified: + type: string + contentLength: + type: integer + format: int64 + httpStatusCode: + type: integer + format: int32 + FileMetadata: + type: object + properties: + eTag: + type: string + size: + type: integer + format: int64 + mimetype: + type: string + cacheControl: + type: string + lastModified: + type: string + contentLength: + type: integer + format: int64 + httpStatusCode: + type: integer + format: int32 + FileObject: + type: object + required: + - name + properties: + name: + type: string + id: + type: string + updated_at: + type: string + created_at: + type: string + last_accessed_at: + type: string + metadata: + $ref: '#/components/schemas/FileMetadata' + ListObjectsInput: + type: object + required: + - prefix + properties: + prefix: + type: string + limit: + type: integer + format: int32 + offset: + type: integer + format: int32 + sortBy: + $ref: '#/components/schemas/SortBy' + MoveObjectInput: + type: object + required: + - bucketId + - sourceKey + - destinationKey + properties: + bucketId: + type: string + sourceKey: + type: string + destinationKey: + type: string + destinationBucket: + type: string + SignedUrlResult: + type: object + required: + - path + properties: + signedURL: + type: string + path: + type: string + error: + type: string + SortBy: + type: object + properties: + column: + type: string + order: + type: string + StorageError: + type: object + properties: + message: + type: string + error: + type: string + statusCode: + type: string + UpdateBucketInput: + type: object + required: + - public + properties: + public: + type: boolean + file_size_limit: + type: integer + format: int64 + allowed_mime_types: + type: array + items: + type: string +servers: + - url: '{baseUrl}' + description: Supabase Storage endpoint + variables: + baseUrl: + default: '' diff --git a/typespec/package-lock.json b/typespec/package-lock.json new file mode 100644 index 0000000..8b3f5c6 --- /dev/null +++ b/typespec/package-lock.json @@ -0,0 +1,2845 @@ +{ + "name": "@supabase/typespec-models", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@supabase/typespec-models", + "version": "1.0.0", + "dependencies": { + "@typespec/compiler": "^0.65.0", + "@typespec/http": "^0.65.0", + "@typespec/openapi": "^0.65.0", + "@typespec/openapi3": "^0.65.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", + "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.2" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "license": "ISC" + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/arborist": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-8.0.5.tgz", + "integrity": "sha512-dFby80JSC3e8825FRGRuhOMWFeKFHokz8j8osLOujmjOSKm6smGu/b1/gbgW0lP8d84iMZO+RxpqBbC5KgL6DQ==", + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^8.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^4.0.0", + "semver": "^7.3.7", + "ssri": "^12.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz", + "integrity": "sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q==", + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-8.0.1.tgz", + "integrity": "sha512-WXlJx9cz3CfHSt9W9Opi1PTFc4WZLFomm5O8wekxQZmkyljrBRwATwDxfC9iOXJwYVmfiW1C1dUe0W2aN0UrSg==", + "license": "ISC", + "dependencies": { + "cacache": "^19.0.0", + "json-parse-even-better-errors": "^4.0.0", + "pacote": "^20.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/pacote": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.1.tgz", + "integrity": "sha512-jTMLD/QK7JMUKg3g7K3M/DEqIbGm7sxclj12eQYIkL3viutSiefTs26IrqIqgGlFsviF/9dlDUZxnpGvkRXtjw==", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^7.5.10" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz", + "integrity": "sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "license": "ISC", + "dependencies": { + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/query": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.1.tgz", + "integrity": "sha512-4OIPFb4weUUwkDXJf4Hh1inAn8neBGq3xsH4ZsAaN6FK3ldrFkH7jSpCc7N9xesi0Sp+EBXJ9eGMDrEww2Ztqw==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz", + "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==", + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.4.1", + "tuf-js": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@typespec/compiler": { + "version": "0.65.3", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.65.3.tgz", + "integrity": "sha512-hPiTMyXYe1ips8o/1OcrzKkdrwFt3NinrD70AldhR6cPNz9O9y9r+TdE62c3VpPNknuamNVJn1jTkOWVhUczxA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.26.2", + "@npmcli/arborist": "^8.0.0", + "ajv": "~8.17.1", + "change-case": "~5.4.4", + "globby": "~14.0.2", + "mustache": "~4.2.0", + "picocolors": "~1.1.1", + "prettier": "~3.4.2", + "prompts": "~2.4.2", + "semver": "^7.6.3", + "temporal-polyfill": "^0.2.5", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.12", + "yaml": "~2.7.0", + "yargs": "~17.7.2" + }, + "bin": { + "tsp": "cmd/tsp.js", + "tsp-server": "cmd/tsp-server.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@typespec/http": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@typespec/http/-/http-0.65.0.tgz", + "integrity": "sha512-mSJUVmlBq4VO2Pv+mXNXccsuq+8AySWUwbJbbyNQTtpb2M9MIKh2+fbnyb8EMjskxpBWNP2DqABhfEMVesVUkg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.65.0", + "@typespec/streams": "~0.65.0" + }, + "peerDependenciesMeta": { + "@typespec/streams": { + "optional": true + } + } + }, + "node_modules/@typespec/openapi": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi/-/openapi-0.65.0.tgz", + "integrity": "sha512-BMrdO2BOTo2Yiz/GMIwZuLSJbtodbKsYTAEOxbKTdrROs8Sgl2QLNitD3W48k3I9KQ69nx4RJt0kSbaAYb8L4Q==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.65.0", + "@typespec/http": "~0.65.0" + } + }, + "node_modules/@typespec/openapi3": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@typespec/openapi3/-/openapi3-0.65.0.tgz", + "integrity": "sha512-TuOCW+TobY8ecWGP2bXduyVYUkjKrCcTKBykxuYHRVEwhs9XW2rpL5vN+V5JP4r/xV0TnADd9Nowi+iwHBFVuw==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "~10.1.1", + "openapi-types": "~12.1.3", + "yaml": "~2.7.0" + }, + "bin": { + "tsp-openapi3": "cmd/tsp-openapi3.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.65.0", + "@typespec/http": "~0.65.0", + "@typespec/json-schema": "~0.65.0", + "@typespec/openapi": "~0.65.0", + "@typespec/versioning": "~0.65.0" + }, + "peerDependenciesMeta": { + "@typespec/json-schema": { + "optional": true + }, + "@typespec/xml": { + "optional": true + } + } + }, + "node_modules/@typespec/versioning": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.65.0.tgz", + "integrity": "sha512-ACNOSgWVpiBwLyA8UlDSDeby+xDYm6wnRCPmdtdoyUpEwgBV/DcJerYf/ujVSCF0jDHItLQ65pC3ydMJDsJWdQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typespec/compiler": "~0.65.0" + } + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bin-links": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz", + "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==", + "license": "ISC", + "dependencies": { + "cmd-shim": "^7.0.0", + "npm-normalize-package-bin": "^4.0.0", + "proc-log": "^5.0.0", + "read-cmd-shim": "^5.0.0", + "write-file-atomic": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "license": "MIT" + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cmd-shim": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz", + "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-uri": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", + "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/hosted-git-info": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "license": "MIT" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "license": "MIT" + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "tar": "^7.4.3", + "tinyglobby": "^0.2.12", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-bundled": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", + "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==", + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-install-checks": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.2.tgz", + "integrity": "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==", + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-packlist": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz", + "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==", + "license": "ISC", + "dependencies": { + "ignore-walk": "^7.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz", + "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==", + "license": "ISC", + "dependencies": { + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/p-map": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.5.tgz", + "integrity": "sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-19.0.2.tgz", + "integrity": "sha512-iNInrWMS+PzYbaef5EW/mU8OiCPxGuTmYn6ht5ImeXd5TZIVY4+dDmIrbpB6v0MKG/KIMMvj2UD7eKU9GbTGHA==", + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^7.5.10" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/parse-conflict-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz", + "integrity": "sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ==", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/proggy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proggy/-/proggy-3.0.0.tgz", + "integrity": "sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", + "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cmd-shim": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz", + "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", + "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "7.5.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", + "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/temporal-polyfill": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.5.tgz", + "integrity": "sha512-ye47xp8Cb0nDguAhrrDS1JT1SzwEV9e26sSsrWzVu+yPZ7LzceEcH0i2gci9jWfOfSCCgM3Qv5nOYShVUUFUXA==", + "license": "MIT", + "dependencies": { + "temporal-spec": "^0.2.4" + } + }, + "node_modules/temporal-spec": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/temporal-spec/-/temporal-spec-0.2.4.tgz", + "integrity": "sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ==", + "license": "ISC" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", + "integrity": "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==", + "license": "MIT", + "dependencies": { + "@tufjs/models": "3.0.1", + "debug": "^4.4.1", + "make-fetch-happen": "^14.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "license": "ISC" + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/write-file-atomic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/typespec/package.json b/typespec/package.json new file mode 100644 index 0000000..f6db5c0 --- /dev/null +++ b/typespec/package.json @@ -0,0 +1,11 @@ +{ + "name": "@supabase/typespec-models", + "version": "1.0.0", + "private": true, + "dependencies": { + "@typespec/compiler": "^0.65.0", + "@typespec/http": "^0.65.0", + "@typespec/openapi": "^0.65.0", + "@typespec/openapi3": "^0.65.0" + } +} diff --git a/typespec/postgrest.tsp b/typespec/postgrest.tsp new file mode 100644 index 0000000..dc801de --- /dev/null +++ b/typespec/postgrest.tsp @@ -0,0 +1,131 @@ +import "@typespec/http"; +import "@typespec/openapi"; + +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +// ─── PostgREST Service ───────────────────────────────────────────────────── +// +// Models the PostgREST HTTP API boundary — paths, HTTP methods, standard +// headers, and the response envelope. The query builder layer (select, +// filters, order, limit, offset) stays hand-written in each SDK because +// PostgREST's filter syntax (id=eq.5, name=like.*foo*) is generated +// dynamically at runtime and cannot be expressed as fixed TypeSpec shapes. +// +// The @query Record captures those dynamic params at the HTTP +// boundary — the generator emits a Map (or equivalent) +// parameter that the query builder populates. This is the TypeSpec +// equivalent of Smithy's @httpQueryParams map. + +@service +@info({ + title: "Supabase PostgREST API", + version: "1.0", +}) +@server("{baseUrl}", "Supabase PostgREST endpoint", { + baseUrl: string, +}) +namespace Supabase.PostgREST; + +// ─── Shared ──────────────────────────────────────────────────────────────── + +@error +model PostgRESTError { + message?: string; + code?: string; + details?: string; + hint?: string; +} + +// Common response headers returned by PostgREST. +// body: unknown maps to {} in JSON Schema — any JSON value (object or array of row objects). +model RowsResponse { + @statusCode statusCode: 200; + @header("Content-Range") contentRange?: string; + @header("Preference-Applied") preferenceApplied?: string; + @body body: unknown; +} + +// INSERT returns 201. +model InsertResponse { + @statusCode statusCode: 201; + @header("Content-Range") contentRange?: string; + @header("Preference-Applied") preferenceApplied?: string; + @body body: unknown; +} + +// ─── Operations ──────────────────────────────────────────────────────────── + +// TypeSpec advantage: interface groups all table-level operations cleanly. +// Smithy lists them flat under the service. + +@route("/{table}") +interface TableOperations { + // SELECT — dynamic query params carry the filter expression built by the SDK + // query builder: ?select=id,name&status=eq.active&order=created_at.desc + @get + from( + @path table: string, + @query(#{explode: true}) params?: Record, + @header("Range") range?: string, + @header("Prefer") prefer?: string, + @header("Accept-Profile") acceptProfile?: string, + ): RowsResponse | PostgRESTError; + + // INSERT + @post + insert( + @path table: string, + @query(#{explode: true}) params?: Record, + @header("Prefer") prefer?: string, + @header("Content-Profile") contentProfile?: string, + @header("Accept-Profile") acceptProfile?: string, + @body body: unknown, + ): InsertResponse | PostgRESTError; + + // UPSERT + @put + upsert( + @path table: string, + @query(#{explode: true}) params?: Record, + @header("Prefer") prefer?: string, + @header("Content-Profile") contentProfile?: string, + @header("Accept-Profile") acceptProfile?: string, + @body body: unknown, + ): RowsResponse | PostgRESTError; + + // UPDATE + @patch + update( + @path table: string, + @query(#{explode: true}) params?: Record, + @header("Prefer") prefer?: string, + @header("Content-Profile") contentProfile?: string, + @header("Accept-Profile") acceptProfile?: string, + @body body: unknown, + ): RowsResponse | PostgRESTError; + + // DELETE + @delete + deleteRows( + @path table: string, + @query(#{explode: true}) params?: Record, + @header("Prefer") prefer?: string, + @header("Content-Profile") contentProfile?: string, + @header("Accept-Profile") acceptProfile?: string, + ): RowsResponse | PostgRESTError; +} + +// RPC — call a Postgres function via PostgREST. +@route("/rpc/{functionName}") +interface RpcOperations { + @post + rpc( + @path functionName: string, + @query(#{explode: true}) params?: Record, + @header("Prefer") prefer?: string, + @header("Content-Profile") contentProfile?: string, + @header("Accept-Profile") acceptProfile?: string, + @body body: unknown, + ): unknown | PostgRESTError; +} diff --git a/typespec/storage.tsp b/typespec/storage.tsp new file mode 100644 index 0000000..8f45f71 --- /dev/null +++ b/typespec/storage.tsp @@ -0,0 +1,280 @@ +import "@typespec/http"; +import "@typespec/openapi"; + +using TypeSpec.Http; +using TypeSpec.OpenAPI; + +@service +@info({ + title: "Supabase Storage API", + version: "1.0", +}) +@server("{baseUrl}", "Supabase Storage endpoint", { + baseUrl: string, +}) +namespace Supabase.Storage; + +// ─── Common ──────────────────────────────────────────────────────────────── + +alias StringList = string[]; + +// ─── Shared Shapes ───────────────────────────────────────────────────────── + +model Bucket { + id: string; + name: string; + @encodedName("application/json", "public") isPublic: boolean; + file_size_limit?: int64; + allowed_mime_types?: StringList; + created_at?: string; + updated_at?: string; +} + +model FileObject { + name: string; + id?: string; + updated_at?: string; + created_at?: string; + last_accessed_at?: string; + metadata?: FileMetadata; +} + +model FileMetadata { + eTag?: string; + size?: int64; + mimetype?: string; + cacheControl?: string; + lastModified?: string; + contentLength?: int64; + httpStatusCode?: int32; +} + +model FileInfo { + eTag?: string; + size?: int64; + mimetype?: string; + cacheControl?: string; + lastModified?: string; + contentLength?: int64; + httpStatusCode?: int32; +} + +model SortBy { + column?: string; + order?: string; +} + +@error +model StorageError { + message?: string; + error?: string; + statusCode?: string; +} + +// ─── Bucket Operations ───────────────────────────────────────────────────── + +model CreateBucketInput { + id: string; + name: string; + @encodedName("application/json", "public") isPublic: boolean; + file_size_limit?: int64; + allowed_mime_types?: StringList; +} + +model UpdateBucketInput { + @encodedName("application/json", "public") isPublic: boolean; + file_size_limit?: int64; + allowed_mime_types?: StringList; +} + +@route("/bucket") +interface Buckets { + @get + list(): Bucket[] | StorageError; + + @get + @route("/{id}") + get(@path id: string): Bucket | StorageError; + + @post + create(@body body: CreateBucketInput): void | StorageError; + + @put + @route("/{id}") + update(@path id: string, @body body: UpdateBucketInput): void | StorageError; + + @post + @route("/{id}/empty") + empty(@path id: string): void | StorageError; + + @delete + @route("/{id}") + deleteBucket(@path id: string): void | StorageError; +} + +// ─── Object Operations ───────────────────────────────────────────────────── + +model MoveObjectInput { + bucketId: string; + sourceKey: string; + destinationKey: string; + destinationBucket?: string; +} + +model CopyObjectInput { + bucketId: string; + sourceKey: string; + destinationKey: string; + destinationBucket?: string; +} + +model CopyObjectOutput { + Key: string; +} + +model ListObjectsInput { + prefix: string; + limit?: int32; + offset?: int32; + sortBy?: SortBy; +} + +model CreateSignedUrlInput { + expiresIn: int32; +} + +model CreateSignedUrlOutput { + signedURL: string; +} + +model CreateSignedUrlsInput { + expiresIn: int32; + paths: StringList; +} + +model SignedUrlResult { + signedURL?: string; + path: string; + error?: string; +} + +model CreateSignedUploadUrlOutput { + url: string; +} + +@route("/object") +interface Objects { + @post + @route("/move") + move(@body body: MoveObjectInput): void | StorageError; + + @post + @route("/copy") + copy(@body body: CopyObjectInput): CopyObjectOutput | StorageError; + + // DELETE with a body — TypeSpec doesn't flag this but it's unconventional. + // Matches Smithy's @suppress(["HttpMethodSemantics.UnexpectedPayload"]). + @delete + @route("/{bucketId}") + deleteObjects( + @path bucketId: string, + @body body: {prefixes: StringList}, + ): FileObject[] | StorageError; + + @post + @route("/list/{bucketId}") + list( + @path bucketId: string, + @body body: ListObjectsInput, + ): FileObject[] | StorageError; + + @get + @route("/info/{bucketId}/{+wildcardPath}") + info( + @path bucketId: string, + @path wildcardPath: string, + ): FileInfo | StorageError; + + @head + @route("/{bucketId}/{+wildcardPath}") + head( + @path bucketId: string, + @path wildcardPath: string, + ): void | StorageError; + + @post + @route("/sign/{bucketId}/{+wildcardPath}") + createSignedUrl( + @path bucketId: string, + @path wildcardPath: string, + @body body: CreateSignedUrlInput, + ): CreateSignedUrlOutput | StorageError; + + @post + @route("/sign/{bucketId}") + createSignedUrls( + @path bucketId: string, + @body body: CreateSignedUrlsInput, + ): SignedUrlResult[] | StorageError; + + @post + @route("/upload/sign/{bucketId}/{+wildcardPath}") + createSignedUploadUrl( + @path bucketId: string, + @path wildcardPath: string, + @header("x-upsert") upsert?: string, + ): CreateSignedUploadUrlOutput | StorageError; +} + +// ─── TUS Resumable Upload Operations ─────────────────────────────────────── +// +// Models the three HTTP operations of the TUS 1.0.0 protocol. The +// application-level state machine (chunk sequencing, 409 retry, pause/resume) +// is NOT generated — it lives in TUSUploadEngine, which calls these operations. + +model TusCreatedResponse { + @statusCode statusCode: 201; + @header location: string; +} + +model UploadChunkOutput { + @statusCode statusCode: 204; + @header("Upload-Offset") uploadOffset: int64; +} + +model GetUploadOffsetOutput { + @header("Upload-Offset") uploadOffset: int64; +} + +@route("/upload/resumable") +interface TusUploads { + // Step 1: Create a new TUS upload session. + @post + create( + @header("Upload-Length") uploadLength: int64, + @header("Upload-Metadata") uploadMetadata: string, + @header("Tus-Resumable") tusResumable: string, + @header("x-upsert") upsert?: string, + ): TusCreatedResponse | StorageError; + + // Step 2: Upload a chunk of data to an existing TUS session. + // Explicit content-type forces application/octet-stream + format: binary in OpenAPI + // (TypeSpec defaults bytes to application/json + format: byte without it). + @patch + @route("/{uploadId}") + uploadChunk( + @path uploadId: string, + @header("Upload-Offset") uploadOffset: int64, + @header("Tus-Resumable") tusResumable: string, + @header contentType: "application/octet-stream", + @body body: bytes, + ): UploadChunkOutput | StorageError; + + // Step 3: Query the server-side offset of a TUS session (used when resuming). + @head + @route("/{uploadId}") + getOffset( + @path uploadId: string, + @header("Tus-Resumable") tusResumable: string, + ): GetUploadOffsetOutput | StorageError; +} diff --git a/typespec/tspconfig.yaml b/typespec/tspconfig.yaml new file mode 100644 index 0000000..c3b03d9 --- /dev/null +++ b/typespec/tspconfig.yaml @@ -0,0 +1,4 @@ +output-dir: "{project-root}/openapi" + +emit: + - "@typespec/openapi3" From 13556ee215a589bdf2ad421552c9922b69b3330a Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 08:42:05 -0300 Subject: [PATCH 2/8] fix(typespec/postgrest): split named params from dynamic filters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add named query params: select, order, limit (integer), offset (integer) as separate typed members on each table operation instead of collapsing everything into one Record params map - Add columns param to insert, on_conflict param to upsert - Add filters: Record (explode: true) for dynamic column filters, separate from the fixed named params - Add FilterOperator enum with all 24 PostgREST operators (matches Smithy) - Split RPC into rpc (POST) + rpcGet (GET) — GET takes args: Record - Add doc comments to all operations and params - Regenerate openapi.Supabase.PostgREST.yaml --- .../openapi3/openapi.Supabase.PostgREST.yaml | 198 ++++++++++++++++-- typespec/postgrest.tsp | 131 +++++++++--- 2 files changed, 288 insertions(+), 41 deletions(-) diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml index eb081a3..174db24 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml @@ -7,19 +7,19 @@ paths: /rpc/{functionName}: post: operationId: RpcOperations_rpc + description: Call an RPC function via POST with a JSON body. parameters: - name: functionName in: path required: true schema: type: string - - name: params + - name: select in: query required: false schema: - type: object - additionalProperties: - type: string + type: string + explode: false - name: Prefer in: header required: false @@ -38,6 +38,15 @@ paths: responses: '200': description: The request has succeeded. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string content: application/json: schema: {} @@ -52,18 +61,111 @@ paths: content: application/json: schema: {} + get: + operationId: RpcOperations_rpcGet + description: |- + Call a read-only RPC function via GET. + Function arguments are passed as query params (each arg is its own param). + parameters: + - name: functionName + in: path + required: true + schema: + type: string + - name: select + in: query + required: false + schema: + type: string + explode: false + - name: args + in: query + required: false + description: Function arguments — each entry becomes its own query parameter. + schema: + type: object + additionalProperties: + type: string + - name: Accept-Profile + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + headers: + Content-Range: + required: false + schema: + type: string + Preference-Applied: + required: false + schema: + type: string + content: + application/json: + schema: {} + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/PostgRESTError' /{table}: get: operationId: TableOperations_from + description: |- + SELECT rows from a table. + + Fixed params (select, order, limit, offset) are named so generators emit + typed, documented parameters. Column filters are passed via `filters`: + each map entry becomes its own query parameter when serialized + (explode: true), e.g. {"id": "eq.5"} → ?id=eq.5. parameters: - name: table in: path required: true schema: type: string - - name: params + - name: select + in: query + required: false + description: |- + Column selection — comma-separated list, supports aliasing, casting, + embedded resources, and JSON operators. e.g. "id,name,orders(total)". + schema: + type: string + explode: false + - name: order + in: query + required: false + description: Ordering — e.g. "name.asc,age.desc.nullslast" + schema: + type: string + explode: false + - name: limit + in: query + required: false + description: Maximum number of rows to return. + schema: + type: integer + explode: false + - name: offset + in: query + required: false + description: Row offset for pagination. + schema: + type: integer + explode: false + - name: filters in: query required: false + description: |- + Horizontal filters — each entry becomes a separate query parameter. + Key: column name (or "or"/"and" for logical groups). + Value: "{operator}.{value}" e.g. {"id": "eq.5", "name": "like.foo*"}. + See FilterOperator for the full operator list. schema: type: object additionalProperties: @@ -106,19 +208,27 @@ paths: $ref: '#/components/schemas/PostgRESTError' post: operationId: TableOperations_insert + description: INSERT rows into a table. parameters: - name: table in: path required: true schema: type: string - - name: params + - name: select in: query required: false + description: 'Column selection for the returned representation (requires Prefer: return=representation).' schema: - type: object - additionalProperties: - type: string + type: string + explode: false + - name: columns + in: query + required: false + description: Columns hint for bulk insert. + schema: + type: string + explode: false - name: Prefer in: header required: false @@ -162,15 +272,30 @@ paths: schema: {} put: operationId: TableOperations_upsert + description: UPSERT rows (PUT). parameters: - name: table in: path required: true schema: type: string - - name: params + - name: select + in: query + required: false + schema: + type: string + explode: false + - name: on_conflict in: query required: false + description: Comma-separated columns to use as the conflict target for upsert. + schema: + type: string + explode: false + - name: filters + in: query + required: false + description: Horizontal filters — each entry becomes a separate query parameter. schema: type: object additionalProperties: @@ -218,15 +343,23 @@ paths: schema: {} patch: operationId: TableOperations_update + description: UPDATE rows matching the filter. parameters: - name: table in: path required: true schema: type: string - - name: params + - name: select in: query required: false + schema: + type: string + explode: false + - name: filters + in: query + required: false + description: Horizontal filters — each entry becomes a separate query parameter. schema: type: object additionalProperties: @@ -274,15 +407,23 @@ paths: schema: {} delete: operationId: TableOperations_deleteRows + description: DELETE rows matching the filter. parameters: - name: table in: path required: true schema: type: string - - name: params + - name: select + in: query + required: false + schema: + type: string + explode: false + - name: filters in: query required: false + description: Horizontal filters — each entry becomes a separate query parameter. schema: type: object additionalProperties: @@ -325,6 +466,39 @@ paths: $ref: '#/components/schemas/PostgRESTError' components: schemas: + FilterOperator: + type: string + enum: + - eq + - neq + - lt + - lte + - gt + - gte + - like + - ilike + - match + - imatch + - is + - isdistinct + - in + - cs + - cd + - ov + - sl + - sr + - nxl + - nxr + - adj + - fts + - plfts + - phfts + - wfts + description: |- + PostgREST column filter operators. + Format a filter value as "{operator}.{value}", e.g. "eq.5". + Prefix with "not." to negate: "not.eq.5". + For logical grouping use keys "or" / "and" in the filters map. PostgRESTError: type: object properties: diff --git a/typespec/postgrest.tsp b/typespec/postgrest.tsp index dc801de..294d00a 100644 --- a/typespec/postgrest.tsp +++ b/typespec/postgrest.tsp @@ -7,15 +7,17 @@ using TypeSpec.OpenAPI; // ─── PostgREST Service ───────────────────────────────────────────────────── // // Models the PostgREST HTTP API boundary — paths, HTTP methods, standard -// headers, and the response envelope. The query builder layer (select, -// filters, order, limit, offset) stays hand-written in each SDK because -// PostgREST's filter syntax (id=eq.5, name=like.*foo*) is generated -// dynamically at runtime and cannot be expressed as fixed TypeSpec shapes. +// headers, query params, and response headers. // -// The @query Record captures those dynamic params at the HTTP -// boundary — the generator emits a Map (or equivalent) -// parameter that the query builder populates. This is the TypeSpec -// equivalent of Smithy's @httpQueryParams map. +// Fixed query params (select, order, limit, offset) are named members so +// generators emit them as typed, documented parameters. Dynamic column +// filters (e.g. ?id=eq.5&name=like.*foo*) cannot be enumerated statically; +// they are expressed via a `filters: Record` member with `explode: true`, +// which expands each key-value pair into its own query parameter. +// +// The query builder layer (.eq(), .like(), .order(), etc.) stays hand-written +// in each SDK — it populates the filters map at runtime. The model only +// describes the HTTP boundary contract. @service @info({ @@ -27,7 +29,7 @@ using TypeSpec.OpenAPI; }) namespace Supabase.PostgREST; -// ─── Shared ──────────────────────────────────────────────────────────────── +// ─── Shared types ───────────────────────────────────────────────────────── @error model PostgRESTError { @@ -37,8 +39,41 @@ model PostgRESTError { hint?: string; } -// Common response headers returned by PostgREST. -// body: unknown maps to {} in JSON Schema — any JSON value (object or array of row objects). +/** PostgREST column filter operators. + * Format a filter value as "{operator}.{value}", e.g. "eq.5". + * Prefix with "not." to negate: "not.eq.5". + * For logical grouping use keys "or" / "and" in the filters map. + */ +enum FilterOperator { + eq, + neq, + lt, + lte, + gt, + gte, + like, + ilike, + match, + imatch, + `is`, + isdistinct, + `in`, + cs, + cd, + ov, + sl, + sr, + nxl, + nxr, + adj, + fts, + plfts, + phfts, + wfts, +} + +// Common response returned by SELECT, UPDATE, UPSERT, DELETE. +// body: unknown maps to {} in JSON Schema — any JSON value (object or array of rows). model RowsResponse { @statusCode statusCode: 200; @header("Content-Range") contentRange?: string; @@ -46,7 +81,7 @@ model RowsResponse { @body body: unknown; } -// INSERT returns 201. +// INSERT returns 201 Created. model InsertResponse { @statusCode statusCode: 201; @header("Content-Range") contentRange?: string; @@ -56,76 +91,114 @@ model InsertResponse { // ─── Operations ──────────────────────────────────────────────────────────── -// TypeSpec advantage: interface groups all table-level operations cleanly. -// Smithy lists them flat under the service. - @route("/{table}") interface TableOperations { - // SELECT — dynamic query params carry the filter expression built by the SDK - // query builder: ?select=id,name&status=eq.active&order=created_at.desc + /** SELECT rows from a table. + * + * Fixed params (select, order, limit, offset) are named so generators emit + * typed, documented parameters. Column filters are passed via `filters`: + * each map entry becomes its own query parameter when serialized + * (explode: true), e.g. {"id": "eq.5"} → ?id=eq.5. + */ @get from( @path table: string, - @query(#{explode: true}) params?: Record, + /** Column selection — comma-separated list, supports aliasing, casting, + * embedded resources, and JSON operators. e.g. "id,name,orders(total)". */ + @query select?: string, + /** Ordering — e.g. "name.asc,age.desc.nullslast" */ + @query order?: string, + /** Maximum number of rows to return. */ + @query limit?: integer, + /** Row offset for pagination. */ + @query offset?: integer, + /** Horizontal filters — each entry becomes a separate query parameter. + * Key: column name (or "or"/"and" for logical groups). + * Value: "{operator}.{value}" e.g. {"id": "eq.5", "name": "like.foo*"}. + * See FilterOperator for the full operator list. */ + @query(#{explode: true}) filters?: Record, @header("Range") range?: string, @header("Prefer") prefer?: string, @header("Accept-Profile") acceptProfile?: string, ): RowsResponse | PostgRESTError; - // INSERT + /** INSERT rows into a table. */ @post insert( @path table: string, - @query(#{explode: true}) params?: Record, + /** Column selection for the returned representation (requires Prefer: return=representation). */ + @query select?: string, + /** Columns hint for bulk insert. */ + @query columns?: string, @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, @body body: unknown, ): InsertResponse | PostgRESTError; - // UPSERT + /** UPSERT rows (PUT). */ @put upsert( @path table: string, - @query(#{explode: true}) params?: Record, + @query select?: string, + /** Comma-separated columns to use as the conflict target for upsert. */ + @query on_conflict?: string, + /** Horizontal filters — each entry becomes a separate query parameter. */ + @query(#{explode: true}) filters?: Record, @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, @body body: unknown, ): RowsResponse | PostgRESTError; - // UPDATE + /** UPDATE rows matching the filter. */ @patch update( @path table: string, - @query(#{explode: true}) params?: Record, + @query select?: string, + /** Horizontal filters — each entry becomes a separate query parameter. */ + @query(#{explode: true}) filters?: Record, @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, @body body: unknown, ): RowsResponse | PostgRESTError; - // DELETE + /** DELETE rows matching the filter. */ @delete deleteRows( @path table: string, - @query(#{explode: true}) params?: Record, + @query select?: string, + /** Horizontal filters — each entry becomes a separate query parameter. */ + @query(#{explode: true}) filters?: Record, @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, ): RowsResponse | PostgRESTError; } -// RPC — call a Postgres function via PostgREST. +/** RPC — call a Postgres function via PostgREST. */ @route("/rpc/{functionName}") interface RpcOperations { + /** Call an RPC function via POST with a JSON body. */ @post rpc( @path functionName: string, - @query(#{explode: true}) params?: Record, + @query select?: string, @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, @body body: unknown, - ): unknown | PostgRESTError; + ): RowsResponse | PostgRESTError; + + /** Call a read-only RPC function via GET. + * Function arguments are passed as query params (each arg is its own param). */ + @get + rpcGet( + @path functionName: string, + @query select?: string, + /** Function arguments — each entry becomes its own query parameter. */ + @query(#{explode: true}) args?: Record, + @header("Accept-Profile") acceptProfile?: string, + ): RowsResponse | PostgRESTError; } From ada4a24049b137837b31f2e389fdb44a2ab45106 Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 08:45:44 -0300 Subject: [PATCH 3/8] fix(typespec/storage): add upload and update multipart operations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add Objects_upload (POST) and Objects_update (PUT) on /{bucketId}/{wildcardPath} using @multipartBody with cacheControl (optional string) and file (bytes) parts. TypeSpec's @multipartBody emits correct multipart/form-data with format:binary natively — no post-generation patching needed, unlike the Smithy pipeline which required patch-openapi.py to inject these operations manually. --- .../openapi3/openapi.Supabase.Storage.yaml | 90 +++++++++++++++++++ typespec/storage.tsp | 34 +++++++ 2 files changed, 124 insertions(+) diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml index 758d1f6..c2dd289 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml @@ -375,6 +375,96 @@ paths: application/json: schema: $ref: '#/components/schemas/StorageError' + post: + operationId: Objects_upload + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + - name: wildcardPath + in: path + required: true + schema: + type: string + - name: x-upsert + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/FileObject' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + cacheControl: + type: string + file: + type: string + format: binary + required: + - file + put: + operationId: Objects_update + parameters: + - name: bucketId + in: path + required: true + schema: + type: string + - name: wildcardPath + in: path + required: true + schema: + type: string + - name: x-upsert + in: header + required: false + schema: + type: string + responses: + '200': + description: The request has succeeded. + content: + application/json: + schema: + $ref: '#/components/schemas/FileObject' + default: + description: An unexpected error response. + content: + application/json: + schema: + $ref: '#/components/schemas/StorageError' + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + cacheControl: + type: string + file: + type: string + format: binary + required: + - file /upload/resumable: post: operationId: TusUploads_create diff --git a/typespec/storage.tsp b/typespec/storage.tsp index 8f45f71..a8cad2b 100644 --- a/typespec/storage.tsp +++ b/typespec/storage.tsp @@ -224,6 +224,40 @@ interface Objects { @path wildcardPath: string, @header("x-upsert") upsert?: string, ): CreateSignedUploadUrlOutput | StorageError; + + // Upload a new object via multipart/form-data. + // TypeSpec's @multipartBody emits correct multipart/form-data OpenAPI natively — + // no post-generation patching needed (unlike the Smithy pipeline). + @post + @route("/{bucketId}/{+wildcardPath}") + upload( + @path bucketId: string, + @path wildcardPath: string, + @header("x-upsert") upsert?: string, + @header contentType: "multipart/form-data", + @multipartBody body: { + /** Cache-Control header value to store with the object. */ + cacheControl?: HttpPart; + /** The file content. */ + file: HttpPart; + }, + ): FileObject | StorageError; + + // Replace an existing object via multipart/form-data. + @put + @route("/{bucketId}/{+wildcardPath}") + update( + @path bucketId: string, + @path wildcardPath: string, + @header("x-upsert") upsert?: string, + @header contentType: "multipart/form-data", + @multipartBody body: { + /** Cache-Control header value to store with the object. */ + cacheControl?: HttpPart; + /** The file content. */ + file: HttpPart; + }, + ): FileObject | StorageError; } // ─── TUS Resumable Upload Operations ─────────────────────────────────────── From c74d35c5c9f6f5b26efc73f90ca5e46535187a4c Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 08:49:35 -0300 Subject: [PATCH 4/8] fix(typespec/postgrest): use bytes+octet-stream instead of unknown for bodies Replace unknown with bytes + explicit @header contentType: application/octet-stream on both response models (RowsResponse, InsertResponse) and request bodies. This makes swift-openapi-generator emit HTTPBody (streaming binary) instead of OpenAPIValueContainer (any-JSON), matching the Smithy output and letting the SDK layer decode the raw bytes into whatever Decodable type the caller requested. --- .../openapi3/openapi.Supabase.PostgREST.yaml | 66 ++++++++++++------- typespec/postgrest.tsp | 22 +++++-- 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml index 174db24..78cb09a 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml @@ -48,8 +48,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: @@ -59,8 +61,10 @@ paths: requestBody: required: true content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary get: operationId: RpcOperations_rpcGet description: |- @@ -104,8 +108,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: @@ -198,8 +204,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: @@ -257,8 +265,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: @@ -268,8 +278,10 @@ paths: requestBody: required: true content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary put: operationId: TableOperations_upsert description: UPSERT rows (PUT). @@ -328,8 +340,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: @@ -339,8 +353,10 @@ paths: requestBody: required: true content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary patch: operationId: TableOperations_update description: UPDATE rows matching the filter. @@ -392,8 +408,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: @@ -403,8 +421,10 @@ paths: requestBody: required: true content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary delete: operationId: TableOperations_deleteRows description: DELETE rows matching the filter. @@ -456,8 +476,10 @@ paths: schema: type: string content: - application/json: - schema: {} + application/octet-stream: + schema: + type: string + format: binary default: description: An unexpected error response. content: diff --git a/typespec/postgrest.tsp b/typespec/postgrest.tsp index 294d00a..2fe7b34 100644 --- a/typespec/postgrest.tsp +++ b/typespec/postgrest.tsp @@ -73,20 +73,24 @@ enum FilterOperator { } // Common response returned by SELECT, UPDATE, UPSERT, DELETE. -// body: unknown maps to {} in JSON Schema — any JSON value (object or array of rows). +// bytes + explicit application/octet-stream content-type emits format:binary in OpenAPI, +// which swift-openapi-generator maps to HTTPBody — letting the SDK layer decode the +// raw JSON into whatever Decodable type the caller requested. model RowsResponse { @statusCode statusCode: 200; + @header contentType: "application/octet-stream"; @header("Content-Range") contentRange?: string; @header("Preference-Applied") preferenceApplied?: string; - @body body: unknown; + @body body: bytes; } // INSERT returns 201 Created. model InsertResponse { @statusCode statusCode: 201; + @header contentType: "application/octet-stream"; @header("Content-Range") contentRange?: string; @header("Preference-Applied") preferenceApplied?: string; - @body body: unknown; + @body body: bytes; } // ─── Operations ──────────────────────────────────────────────────────────── @@ -133,7 +137,8 @@ interface TableOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @body body: unknown, + @header contentType: "application/octet-stream", + @body body: bytes, ): InsertResponse | PostgRESTError; /** UPSERT rows (PUT). */ @@ -148,7 +153,8 @@ interface TableOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @body body: unknown, + @header contentType: "application/octet-stream", + @body body: bytes, ): RowsResponse | PostgRESTError; /** UPDATE rows matching the filter. */ @@ -161,7 +167,8 @@ interface TableOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @body body: unknown, + @header contentType: "application/octet-stream", + @body body: bytes, ): RowsResponse | PostgRESTError; /** DELETE rows matching the filter. */ @@ -188,7 +195,8 @@ interface RpcOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @body body: unknown, + @header contentType: "application/octet-stream", + @body body: bytes, ): RowsResponse | PostgRESTError; /** Call a read-only RPC function via GET. From 54ae8eac6d0e4603120e4ca2ed3812ccf6d075cb Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 08:57:56 -0300 Subject: [PATCH 5/8] fix(typespec): multi-body Functions invoke + JSON PostgREST bodies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Functions: each invoke method (POST/PUT/PATCH/DELETE) now uses @sharedRoute to express four request body content types in one OpenAPI operation: application/json → OpenAPIValueContainer (any JSON) application/octet-stream → HTTPBody (binary) text/plain → String application/x-www-form-urlencoded → String TypeSpec 0.65 @sharedRoute concatenates variant names into the operationId; patch-openapi.py rewrites them to the canonical short form. PostgREST: revert request bodies from bytes/octet-stream back to unknown (→ application/json / OpenAPIValueContainer). PostgREST bodies ARE JSON (row arrays/objects); only response bodies warrant HTTPBody for raw decoding. --- typespec/functions.tsp | 69 ++++++++++--------- .../openapi3/openapi.Supabase.Functions.yaml | 32 +++++++++ .../openapi3/openapi.Supabase.PostgREST.yaml | 24 +++---- typespec/patch-openapi.py | 35 ++++++++++ typespec/postgrest.tsp | 12 ++-- 5 files changed, 116 insertions(+), 56 deletions(-) create mode 100644 typespec/patch-openapi.py diff --git a/typespec/functions.tsp b/typespec/functions.tsp index c0aeba6..f1c40d5 100644 --- a/typespec/functions.tsp +++ b/typespec/functions.tsp @@ -40,9 +40,22 @@ model OctetStreamResponse { // // Known limitation: FunctionInvokeOptions.query (dynamic query params) // cannot be modelled here — requires middleware URL-rewriting in each SDK. +// +// Each HTTP method is expressed as a group of @sharedRoute operations — one per +// supported request body content type — that TypeSpec merges into a single OpenAPI +// operation with multiple requestBody.content entries. swift-openapi-generator +// maps those to a Body enum with one case per content type: +// .json(OpenAPIValueContainer) +// .binary(HTTPBody) +// .plainText(String) +// .urlEncoded(String) +// +// The operationId override (@operationId) avoids the auto-generated +// concatenated name TypeSpec would otherwise produce for sharedRoute groups. @route("/functions/v1") interface FunctionInvocations { + // GET has no request body — functions called with GET pass params in the URL. @get @route("/{functionName}") invokeGet( @@ -50,39 +63,31 @@ interface FunctionInvocations { @header("x-region") region?: string, ): OctetStreamResponse | FunctionsError; - @post - @route("/{functionName}") - invokePost( - @path functionName: string, - @header("x-region") region?: string, - @header contentType?: "application/octet-stream", - @body body?: bytes, - ): OctetStreamResponse | FunctionsError; + // POST — one @sharedRoute variant per supported content type. + @sharedRoute @post @route("/{functionName}") @operationId("FunctionInvocations_invokePost") + invokePostJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + @sharedRoute @post @route("/{functionName}") invokePostBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; + @sharedRoute @post @route("/{functionName}") invokePostText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @post @route("/{functionName}") invokePostForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; - @put - @route("/{functionName}") - invokePut( - @path functionName: string, - @header("x-region") region?: string, - @header contentType?: "application/octet-stream", - @body body?: bytes, - ): OctetStreamResponse | FunctionsError; + // PUT + @sharedRoute @put @route("/{functionName}") @operationId("FunctionInvocations_invokePut") + invokePutJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + @sharedRoute @put @route("/{functionName}") invokePutBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; + @sharedRoute @put @route("/{functionName}") invokePutText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @put @route("/{functionName}") invokePutForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; - @patch - @route("/{functionName}") - invokePatch( - @path functionName: string, - @header("x-region") region?: string, - @header contentType?: "application/octet-stream", - @body body?: bytes, - ): OctetStreamResponse | FunctionsError; + // PATCH + @sharedRoute @patch @route("/{functionName}") @operationId("FunctionInvocations_invokePatch") + invokePatchJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + @sharedRoute @patch @route("/{functionName}") invokePatchBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; + @sharedRoute @patch @route("/{functionName}") invokePatchText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @patch @route("/{functionName}") invokePatchForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; - @delete - @route("/{functionName}") - invokeDelete( - @path functionName: string, - @header("x-region") region?: string, - @header contentType?: "application/octet-stream", - @body body?: bytes, - ): OctetStreamResponse | FunctionsError; + // DELETE + @sharedRoute @delete @route("/{functionName}") @operationId("FunctionInvocations_invokeDelete") + invokeDeleteJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + @sharedRoute @delete @route("/{functionName}") invokeDeleteBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; + @sharedRoute @delete @route("/{functionName}") invokeDeleteText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @delete @route("/{functionName}") invokeDeleteForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; } diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml index 5cb17ff..7ab7f27 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml @@ -62,10 +62,18 @@ paths: requestBody: required: false content: + application/json: + schema: {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string + application/x-www-form-urlencoded: + schema: + type: string put: operationId: FunctionInvocations_invokePut parameters: @@ -96,10 +104,18 @@ paths: requestBody: required: false content: + application/json: + schema: {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string + application/x-www-form-urlencoded: + schema: + type: string patch: operationId: FunctionInvocations_invokePatch parameters: @@ -130,10 +146,18 @@ paths: requestBody: required: false content: + application/json: + schema: {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string + application/x-www-form-urlencoded: + schema: + type: string delete: operationId: FunctionInvocations_invokeDelete parameters: @@ -164,10 +188,18 @@ paths: requestBody: required: false content: + application/json: + schema: {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string + application/x-www-form-urlencoded: + schema: + type: string components: schemas: FunctionsError: diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml index 78cb09a..ab0bf34 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml @@ -61,10 +61,8 @@ paths: requestBody: required: true content: - application/octet-stream: - schema: - type: string - format: binary + application/json: + schema: {} get: operationId: RpcOperations_rpcGet description: |- @@ -278,10 +276,8 @@ paths: requestBody: required: true content: - application/octet-stream: - schema: - type: string - format: binary + application/json: + schema: {} put: operationId: TableOperations_upsert description: UPSERT rows (PUT). @@ -353,10 +349,8 @@ paths: requestBody: required: true content: - application/octet-stream: - schema: - type: string - format: binary + application/json: + schema: {} patch: operationId: TableOperations_update description: UPDATE rows matching the filter. @@ -421,10 +415,8 @@ paths: requestBody: required: true content: - application/octet-stream: - schema: - type: string - format: binary + application/json: + schema: {} delete: operationId: TableOperations_deleteRows description: DELETE rows matching the filter. diff --git a/typespec/patch-openapi.py b/typespec/patch-openapi.py new file mode 100644 index 0000000..61a052b --- /dev/null +++ b/typespec/patch-openapi.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +""" +Post-generation patches for TypeSpec-emitted OpenAPI artifacts. + +TypeSpec 0.65 limitation: @sharedRoute operations always concatenate all variant +names into the operationId (e.g. "invokePost_invokePostBinary_invokePostText_..."). +This script rewrites those concatenated ids to the canonical short form. +""" +import re +import sys +import json +import yaml + +def patch_functions(path: str) -> None: + with open(path) as f: + text = f.read() + + # Each HTTP method's @sharedRoute group produces a concatenated operationId. + # Replace with the clean canonical name (first segment before the first underscore-duplicate). + for method in ("invokePost", "invokePut", "invokePatch", "invokeDelete"): + # Match any concatenation starting with FunctionInvocations_{method} followed by more segments + pattern = re.compile( + r"FunctionInvocations_" + re.escape(method) + r"(?:_FunctionInvocations_\w+)+" + ) + replacement = f"FunctionInvocations_{method}" + text = pattern.sub(replacement, text) + + with open(path, "w") as f: + f.write(text) + print(f"Patched {path}") + +if __name__ == "__main__": + import pathlib, glob, os + openapi_dir = pathlib.Path(__file__).parent / "openapi" / "@typespec" / "openapi3" + patch_functions(str(openapi_dir / "openapi.Supabase.Functions.yaml")) diff --git a/typespec/postgrest.tsp b/typespec/postgrest.tsp index 2fe7b34..01fb473 100644 --- a/typespec/postgrest.tsp +++ b/typespec/postgrest.tsp @@ -137,8 +137,7 @@ interface TableOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @header contentType: "application/octet-stream", - @body body: bytes, + @body body: unknown, ): InsertResponse | PostgRESTError; /** UPSERT rows (PUT). */ @@ -153,8 +152,7 @@ interface TableOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @header contentType: "application/octet-stream", - @body body: bytes, + @body body: unknown, ): RowsResponse | PostgRESTError; /** UPDATE rows matching the filter. */ @@ -167,8 +165,7 @@ interface TableOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @header contentType: "application/octet-stream", - @body body: bytes, + @body body: unknown, ): RowsResponse | PostgRESTError; /** DELETE rows matching the filter. */ @@ -195,8 +192,7 @@ interface RpcOperations { @header("Prefer") prefer?: string, @header("Content-Profile") contentProfile?: string, @header("Accept-Profile") acceptProfile?: string, - @header contentType: "application/octet-stream", - @body body: bytes, + @body body: unknown, ): RowsResponse | PostgRESTError; /** Call a read-only RPC function via GET. From 425843b575fc932674b51aa44313f13b2eb9112a Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 13:52:21 -0300 Subject: [PATCH 6/8] fix(typespec/functions): add multiple response content types to invoke MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each invoke method now returns one of three content types depending on what the function sends back: application/json → any JSON value application/octet-stream → binary text/plain → string Uses the same @sharedRoute pattern as request bodies: Json/Text/Form variants return JsonResponse/TextResponse/JsonResponse respectively; Binary returns OctetStreamResponse. TypeSpec merges them into three response content entries. --- typespec/functions.tsp | 41 ++++++++++++------- .../openapi3/openapi.Supabase.Functions.yaml | 32 +++++++++++++++ 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/typespec/functions.tsp b/typespec/functions.tsp index f1c40d5..7ec99b9 100644 --- a/typespec/functions.tsp +++ b/typespec/functions.tsp @@ -21,14 +21,27 @@ model FunctionsError { message?: string; } -// Explicit content-type on both body and response forces application/octet-stream -// in OpenAPI (TypeSpec defaults bytes to application/json without it). +// Three response models cover the content types a function can return. +// Each @sharedRoute variant is paired with one response model; TypeSpec merges +// them into a single OpenAPI operation with multiple response content entries, +// which swift-openapi-generator maps to a Body enum with one case per type. +model JsonResponse { + @statusCode statusCode: 200; + @body body: unknown; +} + model OctetStreamResponse { @statusCode statusCode: 200; @header contentType: "application/octet-stream"; @body body: bytes; } +model TextResponse { + @statusCode statusCode: 200; + @header contentType: "text/plain"; + @body body: string; +} + // ─── Operations ──────────────────────────────────────────────────────────── // // TypeSpec, like Smithy, requires a fixed HTTP method per operation. @@ -65,29 +78,29 @@ interface FunctionInvocations { // POST — one @sharedRoute variant per supported content type. @sharedRoute @post @route("/{functionName}") @operationId("FunctionInvocations_invokePost") - invokePostJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + invokePostJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; @sharedRoute @post @route("/{functionName}") invokePostBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @post @route("/{functionName}") invokePostText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; - @sharedRoute @post @route("/{functionName}") invokePostForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @post @route("/{functionName}") invokePostText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; + @sharedRoute @post @route("/{functionName}") invokePostForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; // PUT @sharedRoute @put @route("/{functionName}") @operationId("FunctionInvocations_invokePut") - invokePutJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + invokePutJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; @sharedRoute @put @route("/{functionName}") invokePutBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @put @route("/{functionName}") invokePutText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; - @sharedRoute @put @route("/{functionName}") invokePutForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @put @route("/{functionName}") invokePutText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; + @sharedRoute @put @route("/{functionName}") invokePutForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; // PATCH @sharedRoute @patch @route("/{functionName}") @operationId("FunctionInvocations_invokePatch") - invokePatchJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + invokePatchJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; @sharedRoute @patch @route("/{functionName}") invokePatchBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @patch @route("/{functionName}") invokePatchText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; - @sharedRoute @patch @route("/{functionName}") invokePatchForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @patch @route("/{functionName}") invokePatchText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; + @sharedRoute @patch @route("/{functionName}") invokePatchForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; // DELETE @sharedRoute @delete @route("/{functionName}") @operationId("FunctionInvocations_invokeDelete") - invokeDeleteJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): OctetStreamResponse | FunctionsError; + invokeDeleteJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; @sharedRoute @delete @route("/{functionName}") invokeDeleteBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @delete @route("/{functionName}") invokeDeleteText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): OctetStreamResponse | FunctionsError; - @sharedRoute @delete @route("/{functionName}") invokeDeleteForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): OctetStreamResponse | FunctionsError; + @sharedRoute @delete @route("/{functionName}") invokeDeleteText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; + @sharedRoute @delete @route("/{functionName}") invokeDeleteForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; } diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml index 7ab7f27..b13f27b 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml @@ -49,10 +49,18 @@ paths: '200': description: The request has succeeded. content: + application/json: + schema: + anyOf: + - {} + - {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string default: description: An unexpected error response. content: @@ -91,10 +99,18 @@ paths: '200': description: The request has succeeded. content: + application/json: + schema: + anyOf: + - {} + - {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string default: description: An unexpected error response. content: @@ -133,10 +149,18 @@ paths: '200': description: The request has succeeded. content: + application/json: + schema: + anyOf: + - {} + - {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string default: description: An unexpected error response. content: @@ -175,10 +199,18 @@ paths: '200': description: The request has succeeded. content: + application/json: + schema: + anyOf: + - {} + - {} application/octet-stream: schema: type: string format: binary + text/plain: + schema: + type: string default: description: An unexpected error response. content: From aaec7fbb0dbe8239378a859a7d6f98950c306d1c Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 1 Jul 2026 14:02:29 -0300 Subject: [PATCH 7/8] spike(typespec): simplify Functions invoke to generic HTTPBody with */* content type Remove @sharedRoute multi-variant approach in favour of a single operation per HTTP method. A variable contentType header alongside bytes body causes TypeSpec to emit content-type */* in OpenAPI, which swift-openapi-generator maps to case any(HTTPBody) - generic enough for JSON, binary, text, event-stream, etc. This also removes the need for patch-openapi.py entirely. --- typespec/functions.tsp | 106 ++++++++---------- .../openapi3/openapi.Supabase.Functions.yaml | 82 ++------------ 2 files changed, 54 insertions(+), 134 deletions(-) diff --git a/typespec/functions.tsp b/typespec/functions.tsp index 7ec99b9..2cc98a9 100644 --- a/typespec/functions.tsp +++ b/typespec/functions.tsp @@ -21,86 +21,70 @@ model FunctionsError { message?: string; } -// Three response models cover the content types a function can return. -// Each @sharedRoute variant is paired with one response model; TypeSpec merges -// them into a single OpenAPI operation with multiple response content entries, -// which swift-openapi-generator maps to a Body enum with one case per type. -model JsonResponse { +// A single response model covers all content types a function can return. +// Using a variable contentType header alongside bytes makes TypeSpec emit +// content-type */* in OpenAPI, which swift-openapi-generator maps to +// case any(HTTPBody) +// This is generic enough for JSON, binary, text, event-stream, etc. +model FunctionResponse { @statusCode statusCode: 200; - @body body: unknown; -} - -model OctetStreamResponse { - @statusCode statusCode: 200; - @header contentType: "application/octet-stream"; + @header contentType: string; @body body: bytes; } -model TextResponse { - @statusCode statusCode: 200; - @header contentType: "text/plain"; - @body body: string; -} - // ─── Operations ──────────────────────────────────────────────────────────── // -// TypeSpec, like Smithy, requires a fixed HTTP method per operation. -// FunctionsClient.invoke() dispatches to the appropriate generated method -// at runtime based on FunctionInvokeOptions.method. -// -// Advantage over Smithy: TypeSpec's interface groups these naturally vs -// Smithy's flat list at the service level. +// Each HTTP method is a single operation. The request body uses a variable +// contentType header + bytes, which TypeSpec emits as content-type */* in +// OpenAPI → HTTPBody in Swift. Callers set the actual Content-Type header +// via middleware when constructing the request. // // Known limitation: FunctionInvokeOptions.query (dynamic query params) // cannot be modelled here — requires middleware URL-rewriting in each SDK. -// -// Each HTTP method is expressed as a group of @sharedRoute operations — one per -// supported request body content type — that TypeSpec merges into a single OpenAPI -// operation with multiple requestBody.content entries. swift-openapi-generator -// maps those to a Body enum with one case per content type: -// .json(OpenAPIValueContainer) -// .binary(HTTPBody) -// .plainText(String) -// .urlEncoded(String) -// -// The operationId override (@operationId) avoids the auto-generated -// concatenated name TypeSpec would otherwise produce for sharedRoute groups. @route("/functions/v1") interface FunctionInvocations { - // GET has no request body — functions called with GET pass params in the URL. + // GET — no request body; params pass in the URL @get @route("/{functionName}") invokeGet( @path functionName: string, @header("x-region") region?: string, - ): OctetStreamResponse | FunctionsError; + ): FunctionResponse | FunctionsError; - // POST — one @sharedRoute variant per supported content type. - @sharedRoute @post @route("/{functionName}") @operationId("FunctionInvocations_invokePost") - invokePostJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; - @sharedRoute @post @route("/{functionName}") invokePostBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @post @route("/{functionName}") invokePostText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; - @sharedRoute @post @route("/{functionName}") invokePostForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; + @post + @route("/{functionName}") + invokePost( + @path functionName: string, + @header("x-region") region?: string, + @header contentType: string, + @body body?: bytes, + ): FunctionResponse | FunctionsError; - // PUT - @sharedRoute @put @route("/{functionName}") @operationId("FunctionInvocations_invokePut") - invokePutJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; - @sharedRoute @put @route("/{functionName}") invokePutBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @put @route("/{functionName}") invokePutText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; - @sharedRoute @put @route("/{functionName}") invokePutForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; + @put + @route("/{functionName}") + invokePut( + @path functionName: string, + @header("x-region") region?: string, + @header contentType: string, + @body body?: bytes, + ): FunctionResponse | FunctionsError; - // PATCH - @sharedRoute @patch @route("/{functionName}") @operationId("FunctionInvocations_invokePatch") - invokePatchJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; - @sharedRoute @patch @route("/{functionName}") invokePatchBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @patch @route("/{functionName}") invokePatchText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; - @sharedRoute @patch @route("/{functionName}") invokePatchForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; + @patch + @route("/{functionName}") + invokePatch( + @path functionName: string, + @header("x-region") region?: string, + @header contentType: string, + @body body?: bytes, + ): FunctionResponse | FunctionsError; - // DELETE - @sharedRoute @delete @route("/{functionName}") @operationId("FunctionInvocations_invokeDelete") - invokeDeleteJson(@path functionName: string, @header("x-region") region?: string, @body body?: unknown): JsonResponse | FunctionsError; - @sharedRoute @delete @route("/{functionName}") invokeDeleteBinary(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/octet-stream", @body body?: bytes): OctetStreamResponse | FunctionsError; - @sharedRoute @delete @route("/{functionName}") invokeDeleteText(@path functionName: string, @header("x-region") region?: string, @header contentType: "text/plain", @body body?: string): TextResponse | FunctionsError; - @sharedRoute @delete @route("/{functionName}") invokeDeleteForm(@path functionName: string, @header("x-region") region?: string, @header contentType: "application/x-www-form-urlencoded", @body body?: string): JsonResponse | FunctionsError; + @delete + @route("/{functionName}") + invokeDelete( + @path functionName: string, + @header("x-region") region?: string, + @header contentType: string, + @body body?: bytes, + ): FunctionResponse | FunctionsError; } diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml index b13f27b..87a0784 100644 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml @@ -22,7 +22,7 @@ paths: '200': description: The request has succeeded. content: - application/octet-stream: + '*/*': schema: type: string format: binary @@ -49,18 +49,10 @@ paths: '200': description: The request has succeeded. content: - application/json: - schema: - anyOf: - - {} - - {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string default: description: An unexpected error response. content: @@ -70,18 +62,10 @@ paths: requestBody: required: false content: - application/json: - schema: {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string - application/x-www-form-urlencoded: - schema: - type: string put: operationId: FunctionInvocations_invokePut parameters: @@ -99,18 +83,10 @@ paths: '200': description: The request has succeeded. content: - application/json: - schema: - anyOf: - - {} - - {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string default: description: An unexpected error response. content: @@ -120,18 +96,10 @@ paths: requestBody: required: false content: - application/json: - schema: {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string - application/x-www-form-urlencoded: - schema: - type: string patch: operationId: FunctionInvocations_invokePatch parameters: @@ -149,18 +117,10 @@ paths: '200': description: The request has succeeded. content: - application/json: - schema: - anyOf: - - {} - - {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string default: description: An unexpected error response. content: @@ -170,18 +130,10 @@ paths: requestBody: required: false content: - application/json: - schema: {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string - application/x-www-form-urlencoded: - schema: - type: string delete: operationId: FunctionInvocations_invokeDelete parameters: @@ -199,18 +151,10 @@ paths: '200': description: The request has succeeded. content: - application/json: - schema: - anyOf: - - {} - - {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string default: description: An unexpected error response. content: @@ -220,18 +164,10 @@ paths: requestBody: required: false content: - application/json: - schema: {} - application/octet-stream: + '*/*': schema: type: string format: binary - text/plain: - schema: - type: string - application/x-www-form-urlencoded: - schema: - type: string components: schemas: FunctionsError: From 06487b40bdc630f80f3b7b33989b4f5c1347216c Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Thu, 9 Jul 2026 09:30:53 -0300 Subject: [PATCH 8/8] chore(typespec): switch OpenAPI output from YAML to JSON --- .../openapi3/openapi.Supabase.Functions.json | 299 ++++ .../openapi3/openapi.Supabase.Functions.yaml | 183 --- .../openapi3/openapi.Supabase.PostgREST.json | 793 ++++++++++ .../openapi3/openapi.Supabase.PostgREST.yaml | 532 ------- .../openapi3/openapi.Supabase.Storage.json | 1301 +++++++++++++++++ .../openapi3/openapi.Supabase.Storage.yaml | 813 ---------- typespec/tspconfig.yaml | 4 + 7 files changed, 2397 insertions(+), 1528 deletions(-) create mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.json delete mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml create mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.json delete mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml create mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.json delete mode 100644 typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.json b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.json new file mode 100644 index 0000000..5667e89 --- /dev/null +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.json @@ -0,0 +1,299 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Supabase Edge Functions API", + "version": "1.0" + }, + "tags": [], + "paths": { + "/functions/v1/{functionName}": { + "get": { + "operationId": "FunctionInvocations_invokeGet", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-region", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FunctionsError" + } + } + } + } + } + }, + "post": { + "operationId": "FunctionInvocations_invokePost", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-region", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FunctionsError" + } + } + } + } + }, + "requestBody": { + "required": false, + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "put": { + "operationId": "FunctionInvocations_invokePut", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-region", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FunctionsError" + } + } + } + } + }, + "requestBody": { + "required": false, + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "patch": { + "operationId": "FunctionInvocations_invokePatch", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-region", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FunctionsError" + } + } + } + } + }, + "requestBody": { + "required": false, + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "delete": { + "operationId": "FunctionInvocations_invokeDelete", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-region", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FunctionsError" + } + } + } + } + }, + "requestBody": { + "required": false, + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + }, + "components": { + "schemas": { + "FunctionsError": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + }, + "servers": [ + { + "url": "{baseUrl}", + "description": "Supabase Edge Functions endpoint", + "variables": { + "baseUrl": { + "default": "" + } + } + } + ] +} diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml deleted file mode 100644 index 87a0784..0000000 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Functions.yaml +++ /dev/null @@ -1,183 +0,0 @@ -openapi: 3.0.0 -info: - title: Supabase Edge Functions API - version: '1.0' -tags: [] -paths: - /functions/v1/{functionName}: - get: - operationId: FunctionInvocations_invokeGet - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: x-region - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - '*/*': - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/FunctionsError' - post: - operationId: FunctionInvocations_invokePost - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: x-region - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - '*/*': - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/FunctionsError' - requestBody: - required: false - content: - '*/*': - schema: - type: string - format: binary - put: - operationId: FunctionInvocations_invokePut - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: x-region - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - '*/*': - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/FunctionsError' - requestBody: - required: false - content: - '*/*': - schema: - type: string - format: binary - patch: - operationId: FunctionInvocations_invokePatch - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: x-region - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - '*/*': - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/FunctionsError' - requestBody: - required: false - content: - '*/*': - schema: - type: string - format: binary - delete: - operationId: FunctionInvocations_invokeDelete - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: x-region - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - '*/*': - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/FunctionsError' - requestBody: - required: false - content: - '*/*': - schema: - type: string - format: binary -components: - schemas: - FunctionsError: - type: object - properties: - message: - type: string -servers: - - url: '{baseUrl}' - description: Supabase Edge Functions endpoint - variables: - baseUrl: - default: '' diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.json b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.json new file mode 100644 index 0000000..d152aca --- /dev/null +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.json @@ -0,0 +1,793 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Supabase PostgREST API", + "version": "1.0" + }, + "tags": [], + "paths": { + "/rpc/{functionName}": { + "post": { + "operationId": "RpcOperations_rpc", + "description": "Call an RPC function via POST with a JSON body.", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "Prefer", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Content-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "get": { + "operationId": "RpcOperations_rpcGet", + "description": "Call a read-only RPC function via GET.\nFunction arguments are passed as query params (each arg is its own param).", + "parameters": [ + { + "name": "functionName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "args", + "in": "query", + "required": false, + "description": "Function arguments — each entry becomes its own query parameter.", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + } + } + }, + "/{table}": { + "get": { + "operationId": "TableOperations_from", + "description": "SELECT rows from a table.\n\nFixed params (select, order, limit, offset) are named so generators emit\ntyped, documented parameters. Column filters are passed via `filters`:\neach map entry becomes its own query parameter when serialized\n(explode: true), e.g. {\"id\": \"eq.5\"} → ?id=eq.5.", + "parameters": [ + { + "name": "table", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "description": "Column selection — comma-separated list, supports aliasing, casting,\nembedded resources, and JSON operators. e.g. \"id,name,orders(total)\".", + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "order", + "in": "query", + "required": false, + "description": "Ordering — e.g. \"name.asc,age.desc.nullslast\"", + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of rows to return.", + "schema": { + "type": "integer" + }, + "explode": false + }, + { + "name": "offset", + "in": "query", + "required": false, + "description": "Row offset for pagination.", + "schema": { + "type": "integer" + }, + "explode": false + }, + { + "name": "filters", + "in": "query", + "required": false, + "description": "Horizontal filters — each entry becomes a separate query parameter.\nKey: column name (or \"or\"/\"and\" for logical groups).\nValue: \"{operator}.{value}\" e.g. {\"id\": \"eq.5\", \"name\": \"like.foo*\"}.\nSee FilterOperator for the full operator list.", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + { + "name": "Range", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Prefer", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + } + }, + "post": { + "operationId": "TableOperations_insert", + "description": "INSERT rows into a table.", + "parameters": [ + { + "name": "table", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "description": "Column selection for the returned representation (requires Prefer: return=representation).", + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "columns", + "in": "query", + "required": false, + "description": "Columns hint for bulk insert.", + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "Prefer", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Content-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "The request has succeeded and a new resource has been created as a result.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "put": { + "operationId": "TableOperations_upsert", + "description": "UPSERT rows (PUT).", + "parameters": [ + { + "name": "table", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "on_conflict", + "in": "query", + "required": false, + "description": "Comma-separated columns to use as the conflict target for upsert.", + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "filters", + "in": "query", + "required": false, + "description": "Horizontal filters — each entry becomes a separate query parameter.", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + { + "name": "Prefer", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Content-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "patch": { + "operationId": "TableOperations_update", + "description": "UPDATE rows matching the filter.", + "parameters": [ + { + "name": "table", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "filters", + "in": "query", + "required": false, + "description": "Horizontal filters — each entry becomes a separate query parameter.", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + { + "name": "Prefer", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Content-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "delete": { + "operationId": "TableOperations_deleteRows", + "description": "DELETE rows matching the filter.", + "parameters": [ + { + "name": "table", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "select", + "in": "query", + "required": false, + "schema": { + "type": "string" + }, + "explode": false + }, + { + "name": "filters", + "in": "query", + "required": false, + "description": "Horizontal filters — each entry becomes a separate query parameter.", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + { + "name": "Prefer", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Content-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "Accept-Profile", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Content-Range": { + "required": false, + "schema": { + "type": "string" + } + }, + "Preference-Applied": { + "required": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostgRESTError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "FilterOperator": { + "type": "string", + "enum": [ + "eq", + "neq", + "lt", + "lte", + "gt", + "gte", + "like", + "ilike", + "match", + "imatch", + "is", + "isdistinct", + "in", + "cs", + "cd", + "ov", + "sl", + "sr", + "nxl", + "nxr", + "adj", + "fts", + "plfts", + "phfts", + "wfts" + ], + "description": "PostgREST column filter operators.\nFormat a filter value as \"{operator}.{value}\", e.g. \"eq.5\".\nPrefix with \"not.\" to negate: \"not.eq.5\".\nFor logical grouping use keys \"or\" / \"and\" in the filters map." + }, + "PostgRESTError": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "code": { + "type": "string" + }, + "details": { + "type": "string" + }, + "hint": { + "type": "string" + } + } + } + } + }, + "servers": [ + { + "url": "{baseUrl}", + "description": "Supabase PostgREST endpoint", + "variables": { + "baseUrl": { + "default": "" + } + } + } + ] +} diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml deleted file mode 100644 index ab0bf34..0000000 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.PostgREST.yaml +++ /dev/null @@ -1,532 +0,0 @@ -openapi: 3.0.0 -info: - title: Supabase PostgREST API - version: '1.0' -tags: [] -paths: - /rpc/{functionName}: - post: - operationId: RpcOperations_rpc - description: Call an RPC function via POST with a JSON body. - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - schema: - type: string - explode: false - - name: Prefer - in: header - required: false - schema: - type: string - - name: Content-Profile - in: header - required: false - schema: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' - requestBody: - required: true - content: - application/json: - schema: {} - get: - operationId: RpcOperations_rpcGet - description: |- - Call a read-only RPC function via GET. - Function arguments are passed as query params (each arg is its own param). - parameters: - - name: functionName - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - schema: - type: string - explode: false - - name: args - in: query - required: false - description: Function arguments — each entry becomes its own query parameter. - schema: - type: object - additionalProperties: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' - /{table}: - get: - operationId: TableOperations_from - description: |- - SELECT rows from a table. - - Fixed params (select, order, limit, offset) are named so generators emit - typed, documented parameters. Column filters are passed via `filters`: - each map entry becomes its own query parameter when serialized - (explode: true), e.g. {"id": "eq.5"} → ?id=eq.5. - parameters: - - name: table - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - description: |- - Column selection — comma-separated list, supports aliasing, casting, - embedded resources, and JSON operators. e.g. "id,name,orders(total)". - schema: - type: string - explode: false - - name: order - in: query - required: false - description: Ordering — e.g. "name.asc,age.desc.nullslast" - schema: - type: string - explode: false - - name: limit - in: query - required: false - description: Maximum number of rows to return. - schema: - type: integer - explode: false - - name: offset - in: query - required: false - description: Row offset for pagination. - schema: - type: integer - explode: false - - name: filters - in: query - required: false - description: |- - Horizontal filters — each entry becomes a separate query parameter. - Key: column name (or "or"/"and" for logical groups). - Value: "{operator}.{value}" e.g. {"id": "eq.5", "name": "like.foo*"}. - See FilterOperator for the full operator list. - schema: - type: object - additionalProperties: - type: string - - name: Range - in: header - required: false - schema: - type: string - - name: Prefer - in: header - required: false - schema: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' - post: - operationId: TableOperations_insert - description: INSERT rows into a table. - parameters: - - name: table - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - description: 'Column selection for the returned representation (requires Prefer: return=representation).' - schema: - type: string - explode: false - - name: columns - in: query - required: false - description: Columns hint for bulk insert. - schema: - type: string - explode: false - - name: Prefer - in: header - required: false - schema: - type: string - - name: Content-Profile - in: header - required: false - schema: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' - requestBody: - required: true - content: - application/json: - schema: {} - put: - operationId: TableOperations_upsert - description: UPSERT rows (PUT). - parameters: - - name: table - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - schema: - type: string - explode: false - - name: on_conflict - in: query - required: false - description: Comma-separated columns to use as the conflict target for upsert. - schema: - type: string - explode: false - - name: filters - in: query - required: false - description: Horizontal filters — each entry becomes a separate query parameter. - schema: - type: object - additionalProperties: - type: string - - name: Prefer - in: header - required: false - schema: - type: string - - name: Content-Profile - in: header - required: false - schema: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' - requestBody: - required: true - content: - application/json: - schema: {} - patch: - operationId: TableOperations_update - description: UPDATE rows matching the filter. - parameters: - - name: table - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - schema: - type: string - explode: false - - name: filters - in: query - required: false - description: Horizontal filters — each entry becomes a separate query parameter. - schema: - type: object - additionalProperties: - type: string - - name: Prefer - in: header - required: false - schema: - type: string - - name: Content-Profile - in: header - required: false - schema: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' - requestBody: - required: true - content: - application/json: - schema: {} - delete: - operationId: TableOperations_deleteRows - description: DELETE rows matching the filter. - parameters: - - name: table - in: path - required: true - schema: - type: string - - name: select - in: query - required: false - schema: - type: string - explode: false - - name: filters - in: query - required: false - description: Horizontal filters — each entry becomes a separate query parameter. - schema: - type: object - additionalProperties: - type: string - - name: Prefer - in: header - required: false - schema: - type: string - - name: Content-Profile - in: header - required: false - schema: - type: string - - name: Accept-Profile - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Content-Range: - required: false - schema: - type: string - Preference-Applied: - required: false - schema: - type: string - content: - application/octet-stream: - schema: - type: string - format: binary - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/PostgRESTError' -components: - schemas: - FilterOperator: - type: string - enum: - - eq - - neq - - lt - - lte - - gt - - gte - - like - - ilike - - match - - imatch - - is - - isdistinct - - in - - cs - - cd - - ov - - sl - - sr - - nxl - - nxr - - adj - - fts - - plfts - - phfts - - wfts - description: |- - PostgREST column filter operators. - Format a filter value as "{operator}.{value}", e.g. "eq.5". - Prefix with "not." to negate: "not.eq.5". - For logical grouping use keys "or" / "and" in the filters map. - PostgRESTError: - type: object - properties: - message: - type: string - code: - type: string - details: - type: string - hint: - type: string -servers: - - url: '{baseUrl}' - description: Supabase PostgREST endpoint - variables: - baseUrl: - default: '' diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.json b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.json new file mode 100644 index 0000000..9f7bf08 --- /dev/null +++ b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.json @@ -0,0 +1,1301 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Supabase Storage API", + "version": "1.0" + }, + "tags": [], + "paths": { + "/bucket": { + "get": { + "operationId": "Buckets_list", + "parameters": [], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Bucket" + } + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + }, + "post": { + "operationId": "Buckets_create", + "parameters": [], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. " + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateBucketInput" + } + } + } + } + } + }, + "/bucket/{id}": { + "get": { + "operationId": "Buckets_get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Bucket" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + }, + "put": { + "operationId": "Buckets_update", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. " + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateBucketInput" + } + } + } + } + }, + "delete": { + "operationId": "Buckets_deleteBucket", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. " + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + } + }, + "/bucket/{id}/empty": { + "post": { + "operationId": "Buckets_empty", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. " + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + } + }, + "/object/copy": { + "post": { + "operationId": "Objects_copy", + "parameters": [], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyObjectOutput" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CopyObjectInput" + } + } + } + } + } + }, + "/object/info/{bucketId}/{wildcardPath}": { + "get": { + "operationId": "Objects_info", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "wildcardPath", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileInfo" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + } + }, + "/object/list/{bucketId}": { + "post": { + "operationId": "Objects_list", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileObject" + } + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListObjectsInput" + } + } + } + } + } + }, + "/object/move": { + "post": { + "operationId": "Objects_move", + "parameters": [], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. " + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MoveObjectInput" + } + } + } + } + } + }, + "/object/sign/{bucketId}": { + "post": { + "operationId": "Objects_createSignedUrls", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SignedUrlResult" + } + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSignedUrlsInput" + } + } + } + } + } + }, + "/object/sign/{bucketId}/{wildcardPath}": { + "post": { + "operationId": "Objects_createSignedUrl", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "wildcardPath", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSignedUrlOutput" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSignedUrlInput" + } + } + } + } + } + }, + "/object/upload/sign/{bucketId}/{wildcardPath}": { + "post": { + "operationId": "Objects_createSignedUploadUrl", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "wildcardPath", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-upsert", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSignedUploadUrlOutput" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + } + }, + "/object/{bucketId}": { + "delete": { + "operationId": "Objects_deleteObjects", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileObject" + } + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "prefixes": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "prefixes" + ] + } + } + } + } + } + }, + "/object/{bucketId}/{wildcardPath}": { + "head": { + "operationId": "Objects_head", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "wildcardPath", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. " + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + }, + "post": { + "operationId": "Objects_upload", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "wildcardPath", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-upsert", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileObject" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "cacheControl": { + "type": "string" + }, + "file": { + "type": "string", + "format": "binary" + } + }, + "required": [ + "file" + ] + } + } + } + } + }, + "put": { + "operationId": "Objects_update", + "parameters": [ + { + "name": "bucketId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "wildcardPath", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-upsert", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileObject" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "type": "object", + "properties": { + "cacheControl": { + "type": "string" + }, + "file": { + "type": "string", + "format": "binary" + } + }, + "required": [ + "file" + ] + } + } + } + } + } + }, + "/upload/resumable": { + "post": { + "operationId": "TusUploads_create", + "parameters": [ + { + "name": "Upload-Length", + "in": "header", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "Upload-Metadata", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Tus-Resumable", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "x-upsert", + "in": "header", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "201": { + "description": "The request has succeeded and a new resource has been created as a result.", + "headers": { + "location": { + "required": true, + "schema": { + "type": "string" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + } + }, + "/upload/resumable/{uploadId}": { + "patch": { + "operationId": "TusUploads_uploadChunk", + "parameters": [ + { + "name": "uploadId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Upload-Offset", + "in": "header", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "Tus-Resumable", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "There is no content to send for this request, but the headers may be useful. ", + "headers": { + "Upload-Offset": { + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + }, + "requestBody": { + "required": true, + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + }, + "head": { + "operationId": "TusUploads_getOffset", + "parameters": [ + { + "name": "uploadId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Tus-Resumable", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "The request has succeeded.", + "headers": { + "Upload-Offset": { + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Bucket": { + "type": "object", + "required": [ + "id", + "name", + "public" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "public": { + "type": "boolean" + }, + "file_size_limit": { + "type": "integer", + "format": "int64" + }, + "allowed_mime_types": { + "type": "array", + "items": { + "type": "string" + } + }, + "created_at": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + } + }, + "CopyObjectInput": { + "type": "object", + "required": [ + "bucketId", + "sourceKey", + "destinationKey" + ], + "properties": { + "bucketId": { + "type": "string" + }, + "sourceKey": { + "type": "string" + }, + "destinationKey": { + "type": "string" + }, + "destinationBucket": { + "type": "string" + } + } + }, + "CopyObjectOutput": { + "type": "object", + "required": [ + "Key" + ], + "properties": { + "Key": { + "type": "string" + } + } + }, + "CreateBucketInput": { + "type": "object", + "required": [ + "id", + "name", + "public" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "public": { + "type": "boolean" + }, + "file_size_limit": { + "type": "integer", + "format": "int64" + }, + "allowed_mime_types": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "CreateSignedUploadUrlOutput": { + "type": "object", + "required": [ + "url" + ], + "properties": { + "url": { + "type": "string" + } + } + }, + "CreateSignedUrlInput": { + "type": "object", + "required": [ + "expiresIn" + ], + "properties": { + "expiresIn": { + "type": "integer", + "format": "int32" + } + } + }, + "CreateSignedUrlOutput": { + "type": "object", + "required": [ + "signedURL" + ], + "properties": { + "signedURL": { + "type": "string" + } + } + }, + "CreateSignedUrlsInput": { + "type": "object", + "required": [ + "expiresIn", + "paths" + ], + "properties": { + "expiresIn": { + "type": "integer", + "format": "int32" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "FileInfo": { + "type": "object", + "properties": { + "eTag": { + "type": "string" + }, + "size": { + "type": "integer", + "format": "int64" + }, + "mimetype": { + "type": "string" + }, + "cacheControl": { + "type": "string" + }, + "lastModified": { + "type": "string" + }, + "contentLength": { + "type": "integer", + "format": "int64" + }, + "httpStatusCode": { + "type": "integer", + "format": "int32" + } + } + }, + "FileMetadata": { + "type": "object", + "properties": { + "eTag": { + "type": "string" + }, + "size": { + "type": "integer", + "format": "int64" + }, + "mimetype": { + "type": "string" + }, + "cacheControl": { + "type": "string" + }, + "lastModified": { + "type": "string" + }, + "contentLength": { + "type": "integer", + "format": "int64" + }, + "httpStatusCode": { + "type": "integer", + "format": "int32" + } + } + }, + "FileObject": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "last_accessed_at": { + "type": "string" + }, + "metadata": { + "$ref": "#/components/schemas/FileMetadata" + } + } + }, + "ListObjectsInput": { + "type": "object", + "required": [ + "prefix" + ], + "properties": { + "prefix": { + "type": "string" + }, + "limit": { + "type": "integer", + "format": "int32" + }, + "offset": { + "type": "integer", + "format": "int32" + }, + "sortBy": { + "$ref": "#/components/schemas/SortBy" + } + } + }, + "MoveObjectInput": { + "type": "object", + "required": [ + "bucketId", + "sourceKey", + "destinationKey" + ], + "properties": { + "bucketId": { + "type": "string" + }, + "sourceKey": { + "type": "string" + }, + "destinationKey": { + "type": "string" + }, + "destinationBucket": { + "type": "string" + } + } + }, + "SignedUrlResult": { + "type": "object", + "required": [ + "path" + ], + "properties": { + "signedURL": { + "type": "string" + }, + "path": { + "type": "string" + }, + "error": { + "type": "string" + } + } + }, + "SortBy": { + "type": "object", + "properties": { + "column": { + "type": "string" + }, + "order": { + "type": "string" + } + } + }, + "StorageError": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "error": { + "type": "string" + }, + "statusCode": { + "type": "string" + } + } + }, + "UpdateBucketInput": { + "type": "object", + "required": [ + "public" + ], + "properties": { + "public": { + "type": "boolean" + }, + "file_size_limit": { + "type": "integer", + "format": "int64" + }, + "allowed_mime_types": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "servers": [ + { + "url": "{baseUrl}", + "description": "Supabase Storage endpoint", + "variables": { + "baseUrl": { + "default": "" + } + } + } + ] +} diff --git a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml b/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml deleted file mode 100644 index c2dd289..0000000 --- a/typespec/openapi/@typespec/openapi3/openapi.Supabase.Storage.yaml +++ /dev/null @@ -1,813 +0,0 @@ -openapi: 3.0.0 -info: - title: Supabase Storage API - version: '1.0' -tags: [] -paths: - /bucket: - get: - operationId: Buckets_list - parameters: [] - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Bucket' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - post: - operationId: Buckets_create - parameters: [] - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateBucketInput' - /bucket/{id}: - get: - operationId: Buckets_get - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/Bucket' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - put: - operationId: Buckets_update - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UpdateBucketInput' - delete: - operationId: Buckets_deleteBucket - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - /bucket/{id}/empty: - post: - operationId: Buckets_empty - parameters: - - name: id - in: path - required: true - schema: - type: string - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - /object/copy: - post: - operationId: Objects_copy - parameters: [] - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/CopyObjectOutput' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CopyObjectInput' - /object/info/{bucketId}/{wildcardPath}: - get: - operationId: Objects_info - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - - name: wildcardPath - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/FileInfo' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - /object/list/{bucketId}: - post: - operationId: Objects_list - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/FileObject' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ListObjectsInput' - /object/move: - post: - operationId: Objects_move - parameters: [] - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/MoveObjectInput' - /object/sign/{bucketId}: - post: - operationId: Objects_createSignedUrls - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/SignedUrlResult' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateSignedUrlsInput' - /object/sign/{bucketId}/{wildcardPath}: - post: - operationId: Objects_createSignedUrl - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - - name: wildcardPath - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/CreateSignedUrlOutput' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateSignedUrlInput' - /object/upload/sign/{bucketId}/{wildcardPath}: - post: - operationId: Objects_createSignedUploadUrl - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - - name: wildcardPath - in: path - required: true - schema: - type: string - - name: x-upsert - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/CreateSignedUploadUrlOutput' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - /object/{bucketId}: - delete: - operationId: Objects_deleteObjects - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/FileObject' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - prefixes: - type: array - items: - type: string - required: - - prefixes - /object/{bucketId}/{wildcardPath}: - head: - operationId: Objects_head - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - - name: wildcardPath - in: path - required: true - schema: - type: string - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - post: - operationId: Objects_upload - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - - name: wildcardPath - in: path - required: true - schema: - type: string - - name: x-upsert - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/FileObject' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - cacheControl: - type: string - file: - type: string - format: binary - required: - - file - put: - operationId: Objects_update - parameters: - - name: bucketId - in: path - required: true - schema: - type: string - - name: wildcardPath - in: path - required: true - schema: - type: string - - name: x-upsert - in: header - required: false - schema: - type: string - responses: - '200': - description: The request has succeeded. - content: - application/json: - schema: - $ref: '#/components/schemas/FileObject' - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - multipart/form-data: - schema: - type: object - properties: - cacheControl: - type: string - file: - type: string - format: binary - required: - - file - /upload/resumable: - post: - operationId: TusUploads_create - parameters: - - name: Upload-Length - in: header - required: true - schema: - type: integer - format: int64 - - name: Upload-Metadata - in: header - required: true - schema: - type: string - - name: Tus-Resumable - in: header - required: true - schema: - type: string - - name: x-upsert - in: header - required: false - schema: - type: string - responses: - '201': - description: The request has succeeded and a new resource has been created as a result. - headers: - location: - required: true - schema: - type: string - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - /upload/resumable/{uploadId}: - patch: - operationId: TusUploads_uploadChunk - parameters: - - name: uploadId - in: path - required: true - schema: - type: string - - name: Upload-Offset - in: header - required: true - schema: - type: integer - format: int64 - - name: Tus-Resumable - in: header - required: true - schema: - type: string - responses: - '204': - description: 'There is no content to send for this request, but the headers may be useful. ' - headers: - Upload-Offset: - required: true - schema: - type: integer - format: int64 - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' - requestBody: - required: true - content: - application/octet-stream: - schema: - type: string - format: binary - head: - operationId: TusUploads_getOffset - parameters: - - name: uploadId - in: path - required: true - schema: - type: string - - name: Tus-Resumable - in: header - required: true - schema: - type: string - responses: - '200': - description: The request has succeeded. - headers: - Upload-Offset: - required: true - schema: - type: integer - format: int64 - default: - description: An unexpected error response. - content: - application/json: - schema: - $ref: '#/components/schemas/StorageError' -components: - schemas: - Bucket: - type: object - required: - - id - - name - - public - properties: - id: - type: string - name: - type: string - public: - type: boolean - file_size_limit: - type: integer - format: int64 - allowed_mime_types: - type: array - items: - type: string - created_at: - type: string - updated_at: - type: string - CopyObjectInput: - type: object - required: - - bucketId - - sourceKey - - destinationKey - properties: - bucketId: - type: string - sourceKey: - type: string - destinationKey: - type: string - destinationBucket: - type: string - CopyObjectOutput: - type: object - required: - - Key - properties: - Key: - type: string - CreateBucketInput: - type: object - required: - - id - - name - - public - properties: - id: - type: string - name: - type: string - public: - type: boolean - file_size_limit: - type: integer - format: int64 - allowed_mime_types: - type: array - items: - type: string - CreateSignedUploadUrlOutput: - type: object - required: - - url - properties: - url: - type: string - CreateSignedUrlInput: - type: object - required: - - expiresIn - properties: - expiresIn: - type: integer - format: int32 - CreateSignedUrlOutput: - type: object - required: - - signedURL - properties: - signedURL: - type: string - CreateSignedUrlsInput: - type: object - required: - - expiresIn - - paths - properties: - expiresIn: - type: integer - format: int32 - paths: - type: array - items: - type: string - FileInfo: - type: object - properties: - eTag: - type: string - size: - type: integer - format: int64 - mimetype: - type: string - cacheControl: - type: string - lastModified: - type: string - contentLength: - type: integer - format: int64 - httpStatusCode: - type: integer - format: int32 - FileMetadata: - type: object - properties: - eTag: - type: string - size: - type: integer - format: int64 - mimetype: - type: string - cacheControl: - type: string - lastModified: - type: string - contentLength: - type: integer - format: int64 - httpStatusCode: - type: integer - format: int32 - FileObject: - type: object - required: - - name - properties: - name: - type: string - id: - type: string - updated_at: - type: string - created_at: - type: string - last_accessed_at: - type: string - metadata: - $ref: '#/components/schemas/FileMetadata' - ListObjectsInput: - type: object - required: - - prefix - properties: - prefix: - type: string - limit: - type: integer - format: int32 - offset: - type: integer - format: int32 - sortBy: - $ref: '#/components/schemas/SortBy' - MoveObjectInput: - type: object - required: - - bucketId - - sourceKey - - destinationKey - properties: - bucketId: - type: string - sourceKey: - type: string - destinationKey: - type: string - destinationBucket: - type: string - SignedUrlResult: - type: object - required: - - path - properties: - signedURL: - type: string - path: - type: string - error: - type: string - SortBy: - type: object - properties: - column: - type: string - order: - type: string - StorageError: - type: object - properties: - message: - type: string - error: - type: string - statusCode: - type: string - UpdateBucketInput: - type: object - required: - - public - properties: - public: - type: boolean - file_size_limit: - type: integer - format: int64 - allowed_mime_types: - type: array - items: - type: string -servers: - - url: '{baseUrl}' - description: Supabase Storage endpoint - variables: - baseUrl: - default: '' diff --git a/typespec/tspconfig.yaml b/typespec/tspconfig.yaml index c3b03d9..5e77d3a 100644 --- a/typespec/tspconfig.yaml +++ b/typespec/tspconfig.yaml @@ -2,3 +2,7 @@ output-dir: "{project-root}/openapi" emit: - "@typespec/openapi3" + +options: + "@typespec/openapi3": + file-type: "json"