Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
49a309c
docs: add design for adopting swift-openapi-generator in Storage
grdsdev Jul 8, 2026
2372dfe
docs: add implementation plan for Storage OpenAPI adoption (milestone…
grdsdev Jul 8, 2026
e44c37c
feat(storage): vendor OpenAPI spec from supabase/storage#1215
grdsdev Jul 8, 2026
a445a3a
fix(storage): correct invalid OpenAPI 3.1-style nullable types in ven…
grdsdev Jul 8, 2026
c51bbc0
docs: track upstream OpenAPI spec issues found in supabase/storage#1215
grdsdev Jul 8, 2026
4651f5e
fix(storage): convert remaining anyOf-null branches to nullable: true
grdsdev Jul 8, 2026
fcaa78f
feat(storage): generate OpenAPI client from vendored spec
grdsdev Jul 8, 2026
cc2c45d
docs: log second batch of upstream spec issues found during codegen
grdsdev Jul 8, 2026
7c5f5a1
docs: fix stale Types.swift path in plan after Task 2's rename
grdsdev Jul 8, 2026
81c29ee
feat(storage): add StorageOpenAPITransport bridging generated client …
grdsdev Jul 8, 2026
d880b80
feat(storage): wire generated OpenAPI client onto StorageApi
grdsdev Jul 8, 2026
2bb3bda
refactor(storage): migrate listBuckets() to generated OpenAPI client
grdsdev Jul 8, 2026
661e038
fix(storage): use String.date for Bucket.init(fromGenerated:) timestamps
grdsdev Jul 8, 2026
73c2fb3
refactor(storage): migrate getBucket(_:) to generated OpenAPI client
grdsdev Jul 8, 2026
9a4723f
refactor(storage): migrate deleteBucket(_:) to generated OpenAPI client
grdsdev Jul 8, 2026
2b2a4cd
refactor(storage): migrate emptyBucket(_:) to generated OpenAPI client
grdsdev Jul 8, 2026
48a7e96
refactor(storage): migrate createBucket(_:options:) to generated Open…
grdsdev Jul 8, 2026
dffb5bb
fix(storage): strip charset from generated client Content-Type header
grdsdev Jul 8, 2026
7970393
fix(storage): drop redundant anyOf breaking bucketUpdate's generated …
grdsdev Jul 8, 2026
86c6c87
fix(realtime): restore INTEGRATION_TESTS skip guard, fix tearDown crash
grdsdev Jul 8, 2026
7575489
refactor(storage): migrate updateBucket(_:options:) to generated Open…
grdsdev Jul 8, 2026
f1e0aef
fix(storage): restore bare StorageError on OpenAPI-routed error respo…
grdsdev Jul 8, 2026
90c83d2
docs(storage): fix stale StorageOpenAPITransport doc comment
grdsdev Jul 8, 2026
50d0052
docs: add design for migrating upload/update to generated OpenAPI client
grdsdev Jul 8, 2026
348a0bd
docs: add implementation plan for migrating upload endpoints to OpenA…
grdsdev Jul 8, 2026
e13433d
feat(storage): add multipart requestBody to upload spec operations
grdsdev Jul 8, 2026
e40a508
refactor(storage): migrate upload/update to generated OpenAPI client
grdsdev Jul 8, 2026
2faae76
refactor(storage): migrate uploadToSignedURL to generated OpenAPI client
grdsdev Jul 8, 2026
cea2c1b
refactor(storage): remove MultipartFormData, superseded by generated …
grdsdev Jul 8, 2026
39ae846
fix(storage): drop dangling @available(renamed:) reference to Multipa…
grdsdev Jul 8, 2026
f957ec7
fix(storage): restore Cache-Control header on uploadToSignedURL
grdsdev Jul 8, 2026
3467cc1
fix(storage): correct typo in deprecated uploadToSignedURL rename hint
grdsdev Jul 8, 2026
8b6f573
update storage openapi spec
grdsdev Jul 29, 2026
9f8d814
Revert "fix(storage): correct typo in deprecated uploadToSignedURL re…
grdsdev Jul 29, 2026
5a3a58b
Revert "fix(storage): restore Cache-Control header on uploadToSignedURL"
grdsdev Jul 29, 2026
8d42274
Revert "fix(storage): drop dangling @available(renamed:) reference to…
grdsdev Jul 29, 2026
f27b965
Revert "refactor(storage): remove MultipartFormData, superseded by ge…
grdsdev Jul 29, 2026
cc7c82a
Revert "refactor(storage): migrate uploadToSignedURL to generated Ope…
grdsdev Jul 29, 2026
cbc30b1
Revert "refactor(storage): migrate upload/update to generated OpenAPI…
grdsdev Jul 29, 2026
e11ab25
Revert "feat(storage): add multipart requestBody to upload spec opera…
grdsdev Jul 29, 2026
45cf8b7
Revert "fix(storage): restore bare StorageError on OpenAPI-routed err…
grdsdev Jul 29, 2026
aae2b17
Revert "refactor(storage): migrate updateBucket(_:options:) to genera…
grdsdev Jul 29, 2026
d6047d3
Revert "fix(storage): drop redundant anyOf breaking bucketUpdate's ge…
grdsdev Jul 29, 2026
9b385c0
Revert "refactor(storage): migrate createBucket(_:options:) to genera…
grdsdev Jul 29, 2026
d4371a1
Revert "refactor(storage): migrate emptyBucket(_:) to generated OpenA…
grdsdev Jul 29, 2026
592d0ba
Revert "refactor(storage): migrate deleteBucket(_:) to generated Open…
grdsdev Jul 29, 2026
6575b3e
Revert "refactor(storage): migrate getBucket(_:) to generated OpenAPI…
grdsdev Jul 29, 2026
ef6b333
Revert "fix(storage): use String.date for Bucket.init(fromGenerated:)…
grdsdev Jul 29, 2026
8b5ba7e
Revert "refactor(storage): migrate listBuckets() to generated OpenAPI…
grdsdev Jul 29, 2026
279d7d6
feat(storage): scope generated OpenAPI client to vector-bucket operat…
grdsdev Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ let package = Package(
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.17.0"),
.package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.2.2"),
.package(url: "https://github.com/WeTransfer/Mocker", from: "3.0.0"),
.package(url: "https://github.com/apple/swift-openapi-runtime", from: "1.6.0"),
],
targets: [
.target(
Expand Down Expand Up @@ -169,6 +170,7 @@ let package = Package(
dependencies: [
.product(name: "ConcurrencyExtras", package: "swift-concurrency-extras"),
.product(name: "HTTPTypes", package: "swift-http-types"),
.product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"),
"Helpers",
]
),
Expand Down
477 changes: 477 additions & 0 deletions Sources/Storage/Generated/Client.swift

Large diffs are not rendered by default.

1,184 changes: 1,184 additions & 0 deletions Sources/Storage/Generated/Types.swift

Large diffs are not rendered by default.

84 changes: 84 additions & 0 deletions Sources/Storage/OpenAPI/StorageOpenAPITransport.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import Foundation
import HTTPTypes
import OpenAPIRuntime

#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

/// Bridges the generated OpenAPI client's HTTP layer onto ``StorageApi``'s shared header-merging
/// and ``StorageHTTPSession`` pipeline. Unlike the hand-written `execute(_:)` path, this transport
/// never throws on non-2xx responses — it returns them as-is so the generated client's typed
/// `Output` cases carry the real status and error body, and callers decode ``StorageError`` from
/// those cases instead.
struct StorageOpenAPITransport: ClientTransport {
var execute: @Sendable (Helpers.HTTPRequest) async throws -> Helpers.HTTPResponse

func send(
_ request: HTTPTypes.HTTPRequest,
body: OpenAPIRuntime.HTTPBody?,
baseURL: URL,
operationID: String
) async throws -> (HTTPTypes.HTTPResponse, OpenAPIRuntime.HTTPBody?) {
let requestTarget = request.path ?? ""
let pathAndQuery = requestTarget.split(separator: "?", maxSplits: 1)
let path = String(pathAndQuery.first ?? "")
let query = pathAndQuery.count > 1 ? String(pathAndQuery[1]) : nil

guard var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false) else {
throw StorageOpenAPITransportError.invalidBaseURL(baseURL)
}
components.percentEncodedPath += path
components.percentEncodedQuery = query

guard let url = components.url else {
throw StorageOpenAPITransportError.invalidRequestURL(path: requestTarget, baseURL: baseURL)
}

let requestBody: Data?
if let body {
requestBody = try await Data(collecting: body, upTo: .max)
} else {
requestBody = nil
}

var headers = HTTPFields()
for field in request.headerFields {
// ponytail: the generated client always sets an `Accept` header via
// `converter.setAcceptHeader`; the hand-written implementations being migrated never sent
// one, so drop it here to keep wire behavior byte-identical during the migration.
if field.name == .accept { continue }
if field.name == .contentType, field.value == "application/json; charset=utf-8" {
// ponytail: the generated client always appends `; charset=utf-8` to JSON content types
// via `converter.setRequiredRequestBodyAsJSON`; the hand-written implementations being
// migrated always sent plain `application/json`, so strip the suffix here to keep wire
// behavior byte-identical during the migration.
headers[field.name] = "application/json"
continue
}
headers[field.name] = field.value
}

let helpersRequest = Helpers.HTTPRequest(
url: url,
method: request.method,
headers: headers,
body: requestBody
)

let response = try await execute(helpersRequest)

let responseBody: OpenAPIRuntime.HTTPBody? =
response.data.isEmpty ? nil : OpenAPIRuntime.HTTPBody(response.data)

return (
HTTPTypes.HTTPResponse(status: .init(code: response.statusCode)),
responseBody
)
}
}

enum StorageOpenAPITransportError: Error {
case invalidBaseURL(URL)
case invalidRequestURL(path: String, baseURL: URL)
}
10 changes: 10 additions & 0 deletions Sources/Storage/OpenAPI/openapi-generator-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
generate:
- types
- client
accessModifier: internal
filter:
operations:
- vectorBucketCreate
- vectorBucketDelete
- vectorBucketGet
- vectorBucketList
Loading