@seamapi/nextlove-sdk-generator 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.js +10 -0
- package/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.js.map +1 -1
- package/lib/generate-php-sdk/utils/generate-resource-object-class.js +9 -7
- package/lib/generate-php-sdk/utils/generate-resource-object-class.js.map +1 -1
- package/lib/generate-swift-sdk/generate-swift-sdk.d.ts +1 -0
- package/lib/generate-swift-sdk/generate-swift-sdk.js +107 -0
- package/lib/generate-swift-sdk/generate-swift-sdk.js.map +1 -0
- package/lib/generate-swift-sdk/map-swift-type.d.ts +2 -0
- package/lib/generate-swift-sdk/map-swift-type.js +21 -0
- package/lib/generate-swift-sdk/map-swift-type.js.map +1 -0
- package/lib/generate-swift-sdk/route-group-class-file.d.ts +20 -0
- package/lib/generate-swift-sdk/route-group-class-file.js +68 -0
- package/lib/generate-swift-sdk/route-group-class-file.js.map +1 -0
- package/lib/generate-swift-sdk/templates/anyjson.swift.template.d.ts +2 -0
- package/lib/generate-swift-sdk/templates/anyjson.swift.template.js +168 -0
- package/lib/generate-swift-sdk/templates/anyjson.swift.template.js.map +1 -0
- package/lib/generate-swift-sdk/templates/package.swift.template.d.ts +2 -0
- package/lib/generate-swift-sdk/templates/package.swift.template.js +28 -0
- package/lib/generate-swift-sdk/templates/package.swift.template.js.map +1 -0
- package/lib/generate-swift-sdk/templates/readme.md.template.d.ts +2 -0
- package/lib/generate-swift-sdk/templates/readme.md.template.js +48 -0
- package/lib/generate-swift-sdk/templates/readme.md.template.js.map +1 -0
- package/lib/generate-swift-sdk/templates/seamclient.swift.template.d.ts +5 -0
- package/lib/generate-swift-sdk/templates/seamclient.swift.template.js +73 -0
- package/lib/generate-swift-sdk/templates/seamclient.swift.template.js.map +1 -0
- package/lib/types.d.ts +5 -0
- package/package.json +3 -1
- package/src/index.ts +1 -0
- package/src/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.ts +10 -0
- package/src/lib/generate-php-sdk/utils/generate-resource-object-class.ts +14 -7
- package/src/lib/generate-swift-sdk/generate-swift-sdk.ts +135 -0
- package/src/lib/generate-swift-sdk/map-swift-type.ts +27 -0
- package/src/lib/generate-swift-sdk/route-group-class-file.ts +89 -0
- package/src/lib/generate-swift-sdk/templates/anyjson.swift.template.ts +167 -0
- package/src/lib/generate-swift-sdk/templates/package.swift.template.ts +27 -0
- package/src/lib/generate-swift-sdk/templates/readme.md.template.ts +47 -0
- package/src/lib/generate-swift-sdk/templates/seamclient.swift.template.ts +87 -0
- package/src/lib/types.ts +9 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export default () => `# Seam API Swift SDK
|
|
2
|
+
|
|
3
|
+
Official interface to the [Seam Connect API].
|
|
4
|
+
|
|
5
|
+
[Seam Connect API]: https://docs.seam.co/
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
This SDK provides convenient access to the [Seam Connect API] for Swift applications.
|
|
10
|
+
|
|
11
|
+
[Seam API endpoints]: https://docs.seam.co/latest/api-endpoints/overview
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
### Swift Package Manager
|
|
16
|
+
|
|
17
|
+
Add the following dependency to your \`Package.swift\` file:
|
|
18
|
+
|
|
19
|
+
\`\`\`swift
|
|
20
|
+
dependencies: [
|
|
21
|
+
.package(url: "https://github.com/seamapi/swift", .upToNextMajor(from: "0.0.1"))
|
|
22
|
+
]
|
|
23
|
+
\`\`\`
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
_Refer to the [Seam Connect API documentation][Seam Connect API]._
|
|
29
|
+
|
|
30
|
+
### Requirements
|
|
31
|
+
|
|
32
|
+
- An API Key generated via the [Seam Dashboard].
|
|
33
|
+
|
|
34
|
+
[Seam Dashboard]: https://dashboard.getseam.com
|
|
35
|
+
|
|
36
|
+
### Example
|
|
37
|
+
|
|
38
|
+
\`\`\`swift
|
|
39
|
+
import SeamAPI
|
|
40
|
+
|
|
41
|
+
let seam = SeamClient(apiKey: "YOUR_API_KEY")
|
|
42
|
+
|
|
43
|
+
// List devices
|
|
44
|
+
let devices = try await seam.devices.list()
|
|
45
|
+
print(devices)
|
|
46
|
+
\`\`\`
|
|
47
|
+
`
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { camelCase } from "change-case"
|
|
2
|
+
|
|
3
|
+
type SeamClientTemplateOptions = {
|
|
4
|
+
namespaceToRouteGroupClassName: Map<string, string>
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export default ({
|
|
8
|
+
namespaceToRouteGroupClassName,
|
|
9
|
+
}: SeamClientTemplateOptions) => `import Foundation
|
|
10
|
+
#if canImport(FoundationNetworking)
|
|
11
|
+
import FoundationNetworking
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
enum SeamClientError: Error {
|
|
15
|
+
case couldNotMakeRequest(request: URLRequest, error: Error)
|
|
16
|
+
case non2xxResponseData(response: URLResponse, errorType: String?, errorMessage: String?, requestID: String?)
|
|
17
|
+
case responseJSONDecodingError(error: DecodingError)
|
|
18
|
+
case unknown(error: Error)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
class SeamClient {
|
|
22
|
+
var apiKey: String
|
|
23
|
+
var baseURL: URL
|
|
24
|
+
let decoder = JSONDecoder()
|
|
25
|
+
let urlSession = URLSession.init(configuration: .default)
|
|
26
|
+
|
|
27
|
+
${Array.from(namespaceToRouteGroupClassName.entries())
|
|
28
|
+
.map(
|
|
29
|
+
([namespace, route_group_class_name]) =>
|
|
30
|
+
`var ${camelCase(namespace)}: ${route_group_class_name}! = nil`
|
|
31
|
+
)
|
|
32
|
+
.join("\n ")}
|
|
33
|
+
|
|
34
|
+
init(apiKey: String, baseURL: URL = URL(string: "https://connect.getseam.com")!) {
|
|
35
|
+
self.apiKey = apiKey
|
|
36
|
+
self.baseURL = baseURL
|
|
37
|
+
|
|
38
|
+
${Array.from(namespaceToRouteGroupClassName.entries())
|
|
39
|
+
.map(
|
|
40
|
+
([namespace, route_group_class_name]) =>
|
|
41
|
+
`self.${camelCase(
|
|
42
|
+
namespace
|
|
43
|
+
)} = ${route_group_class_name}(client: self)`
|
|
44
|
+
)
|
|
45
|
+
.join("\n ")}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func request<ResponseSchema: Decodable>(method: String, path: String, responseSchema: ResponseSchema.Type, jsonBody: Data? = nil) async -> Result<ResponseSchema, SeamClientError> {
|
|
49
|
+
let url = self.baseURL.appendingPathComponent(path)
|
|
50
|
+
var request = URLRequest(url: url)
|
|
51
|
+
request.httpMethod = method
|
|
52
|
+
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
53
|
+
request.setValue("Bearer \\(apiKey)", forHTTPHeaderField: "Authorization")
|
|
54
|
+
|
|
55
|
+
if let jsonBody = jsonBody {
|
|
56
|
+
request.httpBody = jsonBody
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let requestResult: (Data, URLResponse)
|
|
60
|
+
do {
|
|
61
|
+
requestResult = try await self.urlSession.data(for: request)
|
|
62
|
+
} catch let error {
|
|
63
|
+
return .failure(.couldNotMakeRequest(request: request, error: error))
|
|
64
|
+
}
|
|
65
|
+
let (data, response) = requestResult
|
|
66
|
+
|
|
67
|
+
guard let httpResponse = response as? HTTPURLResponse,
|
|
68
|
+
(200...299).contains(httpResponse.statusCode) else {
|
|
69
|
+
// todo: better error
|
|
70
|
+
return .failure(.non2xxResponseData(
|
|
71
|
+
response: response,
|
|
72
|
+
errorType: nil,
|
|
73
|
+
errorMessage: nil,
|
|
74
|
+
requestID: nil
|
|
75
|
+
))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
do {
|
|
79
|
+
let decoded = try decoder.decode(ResponseSchema.self, from: data)
|
|
80
|
+
return .success(decoded)
|
|
81
|
+
} catch let error as DecodingError {
|
|
82
|
+
return .failure(.responseJSONDecodingError(error: error))
|
|
83
|
+
} catch let error {
|
|
84
|
+
return .failure(.unknown(error: error))
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}`
|
package/src/lib/types.ts
CHANGED
|
@@ -43,16 +43,21 @@ export type PrimitiveSchema =
|
|
|
43
43
|
format?: "uuid" | "date-time" | "uri"
|
|
44
44
|
nullable?: boolean
|
|
45
45
|
}
|
|
46
|
-
| { type: "boolean"; enum?: boolean[] }
|
|
47
|
-
| { type: "integer"; enum?: number[] }
|
|
48
|
-
| { type: "number" }
|
|
46
|
+
| { type: "boolean"; enum?: boolean[]; nullable?: boolean }
|
|
47
|
+
| { type: "integer"; enum?: number[]; nullable?: boolean }
|
|
48
|
+
| { type: "number"; nullable?: boolean }
|
|
49
49
|
|
|
50
|
-
export type ArraySchema = {
|
|
50
|
+
export type ArraySchema = {
|
|
51
|
+
type: "array"
|
|
52
|
+
items: PropertySchema
|
|
53
|
+
nullable?: boolean
|
|
54
|
+
}
|
|
51
55
|
|
|
52
56
|
export type ObjSchema = {
|
|
53
57
|
type: "object"
|
|
54
58
|
properties: Record<string, PropertySchema>
|
|
55
59
|
required: string[]
|
|
60
|
+
nullable?: boolean
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
export type RefSchema = {
|