@executor-js/plugin-openapi 1.5.5 → 1.5.7
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/dist/{AddOpenApiSource-7M52SRUX.js → AddOpenApiSource-7O4LSD7C.js} +79 -241
- package/dist/AddOpenApiSource-7O4LSD7C.js.map +1 -0
- package/dist/{EditOpenApiSource-WTAMRJUK.js → EditOpenApiSource-GIN5RQPL.js} +3 -3
- package/dist/{OpenApiAccountsPanel-3VJJXNQF.js → OpenApiAccountsPanel-7XT6ZMD5.js} +30 -28
- package/dist/OpenApiAccountsPanel-7XT6ZMD5.js.map +1 -0
- package/dist/api/group.d.ts +38 -37
- package/dist/api/index.d.ts +39 -38
- package/dist/{chunk-YVRI7KRC.js → chunk-C3IJX4AN.js} +257 -219
- package/dist/chunk-C3IJX4AN.js.map +1 -0
- package/dist/{chunk-OSIFYIQP.js → chunk-C6PH4R7Q.js} +94 -5
- package/dist/chunk-C6PH4R7Q.js.map +1 -0
- package/dist/{chunk-BSLE6HCE.js → chunk-IB36ED7Y.js} +13 -27
- package/dist/chunk-IB36ED7Y.js.map +1 -0
- package/dist/chunk-RCBR3QMJ.js +73 -0
- package/dist/chunk-RCBR3QMJ.js.map +1 -0
- package/dist/{chunk-V7VCHYOY.js → chunk-WJQIWTZF.js} +97 -172
- package/dist/chunk-WJQIWTZF.js.map +1 -0
- package/dist/client.js +3 -3
- package/dist/core.js +133 -7
- package/dist/core.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/react/AddOpenApiSource.d.ts +0 -1
- package/dist/react/OpenApiSourceDetailsFields.d.ts +3 -0
- package/dist/react/atoms.d.ts +40 -52
- package/dist/react/auth-method-config.d.ts +7 -4
- package/dist/react/client.d.ts +38 -37
- package/dist/sdk/config.d.ts +27 -27
- package/dist/sdk/derive-auth.d.ts +9 -0
- package/dist/sdk/extract.d.ts +11 -1
- package/dist/sdk/index.d.ts +6 -2
- package/dist/sdk/invoke.d.ts +11 -1
- package/dist/sdk/migrate-config.d.ts +4 -0
- package/dist/sdk/migrate-config.test.d.ts +1 -0
- package/dist/sdk/openapi-utils.d.ts +4 -8
- package/dist/sdk/output-schema-migration.d.ts +21 -0
- package/dist/sdk/output-schema-migration.test.d.ts +1 -0
- package/dist/sdk/plugin.d.ts +6 -4
- package/dist/sdk/preview.d.ts +77 -1
- package/dist/sdk/server-url-resolution.test.d.ts +1 -0
- package/dist/sdk/spec-blob-migration.d.ts +7 -0
- package/dist/sdk/spec-blob.test.d.ts +1 -0
- package/dist/sdk/store.d.ts +10 -1
- package/dist/sdk/tool-row-projection.test.d.ts +1 -0
- package/dist/sdk/types.d.ts +61 -36
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing.js +4 -20
- package/dist/testing.js.map +1 -1
- package/package.json +3 -3
- package/dist/AddOpenApiSource-7M52SRUX.js.map +0 -1
- package/dist/OpenApiAccountsPanel-3VJJXNQF.js.map +0 -1
- package/dist/chunk-BSLE6HCE.js.map +0 -1
- package/dist/chunk-OSIFYIQP.js.map +0 -1
- package/dist/chunk-QSSRVK6M.js +0 -139
- package/dist/chunk-QSSRVK6M.js.map +0 -1
- package/dist/chunk-V7VCHYOY.js.map +0 -1
- package/dist/chunk-YVRI7KRC.js.map +0 -1
- /package/dist/{EditOpenApiSource-WTAMRJUK.js.map → EditOpenApiSource-GIN5RQPL.js.map} +0 -0
|
@@ -1,125 +1,27 @@
|
|
|
1
|
-
// src/sdk/types.ts
|
|
2
|
-
import { Schema } from "effect";
|
|
3
|
-
var variable = (name) => ({
|
|
4
|
-
type: "variable",
|
|
5
|
-
name
|
|
6
|
-
});
|
|
7
|
-
var TOKEN_VARIABLE = "token";
|
|
8
|
-
var OperationId = Schema.String.pipe(Schema.brand("OperationId"));
|
|
9
|
-
var HttpMethod = Schema.Literals([
|
|
10
|
-
"get",
|
|
11
|
-
"put",
|
|
12
|
-
"post",
|
|
13
|
-
"delete",
|
|
14
|
-
"patch",
|
|
15
|
-
"head",
|
|
16
|
-
"options",
|
|
17
|
-
"trace"
|
|
18
|
-
]);
|
|
19
|
-
var ParameterLocation = Schema.Literals(["path", "query", "header", "cookie"]);
|
|
20
|
-
var OperationParameter = Schema.Struct({
|
|
21
|
-
name: Schema.String,
|
|
22
|
-
location: ParameterLocation,
|
|
23
|
-
required: Schema.Boolean,
|
|
24
|
-
schema: Schema.OptionFromOptional(Schema.Unknown),
|
|
25
|
-
style: Schema.OptionFromOptional(Schema.String),
|
|
26
|
-
explode: Schema.OptionFromOptional(Schema.Boolean),
|
|
27
|
-
allowReserved: Schema.OptionFromOptional(Schema.Boolean),
|
|
28
|
-
description: Schema.OptionFromOptional(Schema.String)
|
|
29
|
-
});
|
|
30
|
-
var EncodingObject = Schema.Struct({
|
|
31
|
-
contentType: Schema.OptionFromOptional(Schema.String),
|
|
32
|
-
style: Schema.OptionFromOptional(Schema.String),
|
|
33
|
-
explode: Schema.OptionFromOptional(Schema.Boolean),
|
|
34
|
-
allowReserved: Schema.OptionFromOptional(Schema.Boolean)
|
|
35
|
-
});
|
|
36
|
-
var MediaBinding = Schema.Struct({
|
|
37
|
-
contentType: Schema.String,
|
|
38
|
-
schema: Schema.OptionFromOptional(Schema.Unknown),
|
|
39
|
-
encoding: Schema.OptionFromOptional(Schema.Record(Schema.String, EncodingObject))
|
|
40
|
-
});
|
|
41
|
-
var OperationRequestBody = Schema.Struct({
|
|
42
|
-
required: Schema.Boolean,
|
|
43
|
-
/** Default media type — first declared in spec order (not JSON-first).
|
|
44
|
-
* Used when the caller does not override via the tool's `contentType` arg. */
|
|
45
|
-
contentType: Schema.String,
|
|
46
|
-
/** Schema of the default media type. Kept for backward compat with stored
|
|
47
|
-
* bindings from before `contents` was added. */
|
|
48
|
-
schema: Schema.OptionFromOptional(Schema.Unknown),
|
|
49
|
-
/** All declared media types in spec order. Populated by `extract.ts`
|
|
50
|
-
* going forward; older persisted bindings may have this unset and will
|
|
51
|
-
* fall back to `{contentType, schema}`. */
|
|
52
|
-
contents: Schema.OptionFromOptional(Schema.Array(MediaBinding))
|
|
53
|
-
});
|
|
54
|
-
var ExtractedOperation = Schema.Struct({
|
|
55
|
-
operationId: OperationId,
|
|
56
|
-
toolPath: Schema.OptionFromOptional(Schema.String),
|
|
57
|
-
method: HttpMethod,
|
|
58
|
-
baseUrl: Schema.optional(Schema.String),
|
|
59
|
-
pathTemplate: Schema.String,
|
|
60
|
-
summary: Schema.OptionFromOptional(Schema.String),
|
|
61
|
-
description: Schema.OptionFromOptional(Schema.String),
|
|
62
|
-
tags: Schema.Array(Schema.String),
|
|
63
|
-
parameters: Schema.Array(OperationParameter),
|
|
64
|
-
requestBody: Schema.OptionFromOptional(OperationRequestBody),
|
|
65
|
-
inputSchema: Schema.OptionFromOptional(Schema.Unknown),
|
|
66
|
-
outputSchema: Schema.OptionFromOptional(Schema.Unknown),
|
|
67
|
-
deprecated: Schema.Boolean
|
|
68
|
-
});
|
|
69
|
-
var ServerVariable = Schema.Struct({
|
|
70
|
-
default: Schema.String,
|
|
71
|
-
enum: Schema.OptionFromOptional(Schema.Array(Schema.String)),
|
|
72
|
-
description: Schema.OptionFromOptional(Schema.String)
|
|
73
|
-
});
|
|
74
|
-
var ServerInfo = Schema.Struct({
|
|
75
|
-
url: Schema.String,
|
|
76
|
-
description: Schema.OptionFromOptional(Schema.String),
|
|
77
|
-
variables: Schema.OptionFromOptional(Schema.Record(Schema.String, ServerVariable))
|
|
78
|
-
});
|
|
79
|
-
var ExtractionResult = Schema.Struct({
|
|
80
|
-
title: Schema.OptionFromOptional(Schema.String),
|
|
81
|
-
version: Schema.OptionFromOptional(Schema.String),
|
|
82
|
-
servers: Schema.Array(ServerInfo),
|
|
83
|
-
operations: Schema.Array(ExtractedOperation)
|
|
84
|
-
});
|
|
85
|
-
var OperationBinding = Schema.Struct({
|
|
86
|
-
method: HttpMethod,
|
|
87
|
-
baseUrl: Schema.optional(Schema.String),
|
|
88
|
-
pathTemplate: Schema.String,
|
|
89
|
-
parameters: Schema.Array(OperationParameter),
|
|
90
|
-
requestBody: Schema.OptionFromOptional(OperationRequestBody)
|
|
91
|
-
});
|
|
92
|
-
var InvocationResult = Schema.Struct({
|
|
93
|
-
status: Schema.Number,
|
|
94
|
-
headers: Schema.Record(Schema.String, Schema.String),
|
|
95
|
-
data: Schema.NullOr(Schema.Unknown),
|
|
96
|
-
error: Schema.NullOr(Schema.Unknown)
|
|
97
|
-
});
|
|
98
|
-
|
|
99
1
|
// src/sdk/errors.ts
|
|
100
|
-
import { Data, Schema
|
|
101
|
-
var OpenApiParseError = class extends
|
|
2
|
+
import { Data, Schema } from "effect";
|
|
3
|
+
var OpenApiParseError = class extends Schema.TaggedErrorClass()(
|
|
102
4
|
"OpenApiParseError",
|
|
103
5
|
{
|
|
104
|
-
message:
|
|
6
|
+
message: Schema.String
|
|
105
7
|
},
|
|
106
8
|
{ httpApiStatus: 400 }
|
|
107
9
|
) {
|
|
108
10
|
};
|
|
109
|
-
var OpenApiExtractionError = class extends
|
|
11
|
+
var OpenApiExtractionError = class extends Schema.TaggedErrorClass()(
|
|
110
12
|
"OpenApiExtractionError",
|
|
111
13
|
{
|
|
112
|
-
message:
|
|
14
|
+
message: Schema.String
|
|
113
15
|
},
|
|
114
16
|
{ httpApiStatus: 400 }
|
|
115
17
|
) {
|
|
116
18
|
};
|
|
117
19
|
var OpenApiInvocationError = class extends Data.TaggedError("OpenApiInvocationError") {
|
|
118
20
|
};
|
|
119
|
-
var OpenApiOAuthError = class extends
|
|
21
|
+
var OpenApiOAuthError = class extends Schema.TaggedErrorClass()(
|
|
120
22
|
"OpenApiOAuthError",
|
|
121
23
|
{
|
|
122
|
-
message:
|
|
24
|
+
message: Schema.String
|
|
123
25
|
},
|
|
124
26
|
{ httpApiStatus: 400 }
|
|
125
27
|
) {
|
|
@@ -128,7 +30,7 @@ var OpenApiAuthRequiredError = class extends Data.TaggedError("OpenApiAuthRequir
|
|
|
128
30
|
};
|
|
129
31
|
|
|
130
32
|
// src/sdk/parse.ts
|
|
131
|
-
import { Duration, Effect, Schema as
|
|
33
|
+
import { Duration, Effect, Schema as Schema2 } from "effect";
|
|
132
34
|
import { HttpClient, HttpClientRequest } from "effect/unstable/http";
|
|
133
35
|
import YAML from "yaml";
|
|
134
36
|
var OpenApiExtractionErrorFromParse = class extends OpenApiExtractionError {
|
|
@@ -198,7 +100,7 @@ var parseTextToObject = (text) => Effect.gen(function* () {
|
|
|
198
100
|
}
|
|
199
101
|
return parsed;
|
|
200
102
|
});
|
|
201
|
-
var parseJsonText =
|
|
103
|
+
var parseJsonText = Schema2.decodeUnknownEffect(Schema2.fromJsonString(Schema2.Unknown));
|
|
202
104
|
var parseJsonLike = (text) => {
|
|
203
105
|
const parseYaml = Effect.try({
|
|
204
106
|
try: () => YAML.parse(text),
|
|
@@ -209,7 +111,6 @@ var parseJsonLike = (text) => {
|
|
|
209
111
|
};
|
|
210
112
|
|
|
211
113
|
// src/sdk/openapi-utils.ts
|
|
212
|
-
import { Option } from "effect";
|
|
213
114
|
var DocResolver = class {
|
|
214
115
|
constructor(doc) {
|
|
215
116
|
this.doc = doc;
|
|
@@ -242,33 +143,13 @@ var substituteUrlVariables = (url, values) => {
|
|
|
242
143
|
}
|
|
243
144
|
return out;
|
|
244
145
|
};
|
|
245
|
-
var
|
|
246
|
-
var expandServerUrlOptions = (server, limit = OPENAPI_MAX_SERVER_VARIABLE_OPTIONS) => {
|
|
247
|
-
if (!Option.isSome(server.variables)) return [server.url];
|
|
248
|
-
let urls = [server.url];
|
|
249
|
-
for (const [name, variable2] of Object.entries(server.variables.value)) {
|
|
250
|
-
const enumValues = typeof variable2 === "string" ? [] : Option.getOrElse(variable2.enum, () => []);
|
|
251
|
-
const values = enumValues.length > 0 ? enumValues : [typeof variable2 === "string" ? variable2 : variable2.default];
|
|
252
|
-
const next = [];
|
|
253
|
-
for (const url of urls) {
|
|
254
|
-
for (const value of values) {
|
|
255
|
-
next.push(url.replaceAll(`{${name}}`, value));
|
|
256
|
-
if (next.length >= limit) return next;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
urls = next;
|
|
260
|
-
}
|
|
261
|
-
return urls;
|
|
262
|
-
};
|
|
263
|
-
var resolveBaseUrl = (servers) => {
|
|
264
|
-
const server = servers[0];
|
|
265
|
-
if (!server) return "";
|
|
266
|
-
if (!Option.isSome(server.variables)) return server.url;
|
|
146
|
+
var resolveServerUrl = (templateUrl, variables, overrides) => {
|
|
267
147
|
const values = {};
|
|
268
|
-
for (const [name, v] of Object.entries(
|
|
269
|
-
|
|
148
|
+
for (const [name, v] of Object.entries(variables ?? {})) values[name] = v.default;
|
|
149
|
+
for (const [name, value] of Object.entries(overrides)) {
|
|
150
|
+
if (value) values[name] = value;
|
|
270
151
|
}
|
|
271
|
-
return substituteUrlVariables(
|
|
152
|
+
return substituteUrlVariables(templateUrl, values);
|
|
272
153
|
};
|
|
273
154
|
var declaredContents = (content) => {
|
|
274
155
|
if (!content) return [];
|
|
@@ -285,8 +166,114 @@ var preferredResponseContent = (content) => {
|
|
|
285
166
|
return pick ? { mediaType: pick[0], media: pick[1] } : void 0;
|
|
286
167
|
};
|
|
287
168
|
|
|
169
|
+
// src/sdk/types.ts
|
|
170
|
+
import { Schema as Schema3 } from "effect";
|
|
171
|
+
import { AuthTemplateSlug } from "@executor-js/sdk/shared";
|
|
172
|
+
import {
|
|
173
|
+
apiKeyMethodFromAuthTemplate,
|
|
174
|
+
isApiKeyAuthTemplate
|
|
175
|
+
} from "@executor-js/sdk/http-auth";
|
|
176
|
+
import { TOKEN_VARIABLE } from "@executor-js/sdk/http-auth";
|
|
177
|
+
var normalizeOpenApiAuthInputs = (inputs) => inputs.map((input) => {
|
|
178
|
+
if (!isApiKeyAuthTemplate(input)) {
|
|
179
|
+
return { ...input, slug: AuthTemplateSlug.make(input.slug) };
|
|
180
|
+
}
|
|
181
|
+
const method = apiKeyMethodFromAuthTemplate(input);
|
|
182
|
+
return { ...method, slug: method.slug ?? "" };
|
|
183
|
+
});
|
|
184
|
+
var OperationId = Schema3.String.pipe(Schema3.brand("OperationId"));
|
|
185
|
+
var HttpMethod = Schema3.Literals([
|
|
186
|
+
"get",
|
|
187
|
+
"put",
|
|
188
|
+
"post",
|
|
189
|
+
"delete",
|
|
190
|
+
"patch",
|
|
191
|
+
"head",
|
|
192
|
+
"options",
|
|
193
|
+
"trace"
|
|
194
|
+
]);
|
|
195
|
+
var ParameterLocation = Schema3.Literals(["path", "query", "header", "cookie"]);
|
|
196
|
+
var OperationParameter = Schema3.Struct({
|
|
197
|
+
name: Schema3.String,
|
|
198
|
+
location: ParameterLocation,
|
|
199
|
+
required: Schema3.Boolean,
|
|
200
|
+
schema: Schema3.OptionFromOptional(Schema3.Unknown),
|
|
201
|
+
style: Schema3.OptionFromOptional(Schema3.String),
|
|
202
|
+
explode: Schema3.OptionFromOptional(Schema3.Boolean),
|
|
203
|
+
allowReserved: Schema3.OptionFromOptional(Schema3.Boolean),
|
|
204
|
+
description: Schema3.OptionFromOptional(Schema3.String)
|
|
205
|
+
});
|
|
206
|
+
var EncodingObject = Schema3.Struct({
|
|
207
|
+
contentType: Schema3.OptionFromOptional(Schema3.String),
|
|
208
|
+
style: Schema3.OptionFromOptional(Schema3.String),
|
|
209
|
+
explode: Schema3.OptionFromOptional(Schema3.Boolean),
|
|
210
|
+
allowReserved: Schema3.OptionFromOptional(Schema3.Boolean)
|
|
211
|
+
});
|
|
212
|
+
var MediaBinding = Schema3.Struct({
|
|
213
|
+
contentType: Schema3.String,
|
|
214
|
+
schema: Schema3.OptionFromOptional(Schema3.Unknown),
|
|
215
|
+
encoding: Schema3.OptionFromOptional(Schema3.Record(Schema3.String, EncodingObject))
|
|
216
|
+
});
|
|
217
|
+
var OperationRequestBody = Schema3.Struct({
|
|
218
|
+
required: Schema3.Boolean,
|
|
219
|
+
/** Default media type — first declared in spec order (not JSON-first).
|
|
220
|
+
* Used when the caller does not override via the tool's `contentType` arg. */
|
|
221
|
+
contentType: Schema3.String,
|
|
222
|
+
/** Schema of the default media type. Kept for backward compat with stored
|
|
223
|
+
* bindings from before `contents` was added. */
|
|
224
|
+
schema: Schema3.OptionFromOptional(Schema3.Unknown),
|
|
225
|
+
/** All declared media types in spec order. Populated by `extract.ts`
|
|
226
|
+
* going forward; older persisted bindings may have this unset and will
|
|
227
|
+
* fall back to `{contentType, schema}`. */
|
|
228
|
+
contents: Schema3.OptionFromOptional(Schema3.Array(MediaBinding))
|
|
229
|
+
});
|
|
230
|
+
var ServerVariable = Schema3.Struct({
|
|
231
|
+
default: Schema3.String,
|
|
232
|
+
enum: Schema3.OptionFromOptional(Schema3.Array(Schema3.String)),
|
|
233
|
+
description: Schema3.OptionFromOptional(Schema3.String)
|
|
234
|
+
});
|
|
235
|
+
var ServerInfo = Schema3.Struct({
|
|
236
|
+
url: Schema3.String,
|
|
237
|
+
description: Schema3.OptionFromOptional(Schema3.String),
|
|
238
|
+
variables: Schema3.OptionFromOptional(Schema3.Record(Schema3.String, ServerVariable))
|
|
239
|
+
});
|
|
240
|
+
var ExtractedOperation = Schema3.Struct({
|
|
241
|
+
operationId: OperationId,
|
|
242
|
+
toolPath: Schema3.OptionFromOptional(Schema3.String),
|
|
243
|
+
method: HttpMethod,
|
|
244
|
+
servers: Schema3.Array(ServerInfo),
|
|
245
|
+
pathTemplate: Schema3.String,
|
|
246
|
+
summary: Schema3.OptionFromOptional(Schema3.String),
|
|
247
|
+
description: Schema3.OptionFromOptional(Schema3.String),
|
|
248
|
+
tags: Schema3.Array(Schema3.String),
|
|
249
|
+
parameters: Schema3.Array(OperationParameter),
|
|
250
|
+
requestBody: Schema3.OptionFromOptional(OperationRequestBody),
|
|
251
|
+
inputSchema: Schema3.OptionFromOptional(Schema3.Unknown),
|
|
252
|
+
outputSchema: Schema3.OptionFromOptional(Schema3.Unknown),
|
|
253
|
+
deprecated: Schema3.Boolean
|
|
254
|
+
});
|
|
255
|
+
var ExtractionResult = Schema3.Struct({
|
|
256
|
+
title: Schema3.OptionFromOptional(Schema3.String),
|
|
257
|
+
version: Schema3.OptionFromOptional(Schema3.String),
|
|
258
|
+
servers: Schema3.Array(ServerInfo),
|
|
259
|
+
operations: Schema3.Array(ExtractedOperation)
|
|
260
|
+
});
|
|
261
|
+
var OperationBinding = Schema3.Struct({
|
|
262
|
+
method: HttpMethod,
|
|
263
|
+
servers: Schema3.optional(Schema3.Array(ServerInfo)),
|
|
264
|
+
pathTemplate: Schema3.String,
|
|
265
|
+
parameters: Schema3.Array(OperationParameter),
|
|
266
|
+
requestBody: Schema3.OptionFromOptional(OperationRequestBody)
|
|
267
|
+
});
|
|
268
|
+
var InvocationResult = Schema3.Struct({
|
|
269
|
+
status: Schema3.Number,
|
|
270
|
+
headers: Schema3.Record(Schema3.String, Schema3.String),
|
|
271
|
+
data: Schema3.NullOr(Schema3.Unknown),
|
|
272
|
+
error: Schema3.NullOr(Schema3.Unknown)
|
|
273
|
+
});
|
|
274
|
+
|
|
288
275
|
// src/sdk/extract.ts
|
|
289
|
-
import { Effect as Effect2, Option
|
|
276
|
+
import { Effect as Effect2, Option } from "effect";
|
|
290
277
|
var HTTP_METHODS = [
|
|
291
278
|
"get",
|
|
292
279
|
"put",
|
|
@@ -315,11 +302,11 @@ var extractParameters = (pathItem, operation, r) => {
|
|
|
315
302
|
name: p.name,
|
|
316
303
|
location: p.in,
|
|
317
304
|
required: p.in === "path" ? true : p.required === true,
|
|
318
|
-
schema:
|
|
319
|
-
style:
|
|
320
|
-
explode:
|
|
321
|
-
allowReserved:
|
|
322
|
-
description:
|
|
305
|
+
schema: Option.fromNullishOr(p.schema),
|
|
306
|
+
style: Option.fromNullishOr(p.style),
|
|
307
|
+
explode: Option.fromNullishOr(p.explode),
|
|
308
|
+
allowReserved: Option.fromNullishOr("allowReserved" in p ? p.allowReserved : void 0),
|
|
309
|
+
description: Option.fromNullishOr(p.description)
|
|
323
310
|
})
|
|
324
311
|
);
|
|
325
312
|
};
|
|
@@ -330,10 +317,10 @@ var buildEncodingRecord = (encoding) => {
|
|
|
330
317
|
if (typeof raw !== "object" || raw === null) continue;
|
|
331
318
|
const e = raw;
|
|
332
319
|
out[prop] = EncodingObject.make({
|
|
333
|
-
contentType:
|
|
334
|
-
style:
|
|
335
|
-
explode:
|
|
336
|
-
allowReserved:
|
|
320
|
+
contentType: Option.fromNullishOr(e.contentType),
|
|
321
|
+
style: Option.fromNullishOr(e.style),
|
|
322
|
+
explode: Option.fromNullishOr(e.explode),
|
|
323
|
+
allowReserved: Option.fromNullishOr(e.allowReserved)
|
|
337
324
|
});
|
|
338
325
|
}
|
|
339
326
|
return Object.keys(out).length > 0 ? out : void 0;
|
|
@@ -345,8 +332,8 @@ var extractRequestBody = (operation, r) => {
|
|
|
345
332
|
const contents = declaredContents(body.content).map(
|
|
346
333
|
({ mediaType, media }) => MediaBinding.make({
|
|
347
334
|
contentType: mediaType,
|
|
348
|
-
schema:
|
|
349
|
-
encoding:
|
|
335
|
+
schema: Option.fromNullishOr(media.schema),
|
|
336
|
+
encoding: Option.fromNullishOr(
|
|
350
337
|
buildEncodingRecord(media.encoding)
|
|
351
338
|
)
|
|
352
339
|
})
|
|
@@ -357,7 +344,7 @@ var extractRequestBody = (operation, r) => {
|
|
|
357
344
|
required: body.required === true,
|
|
358
345
|
contentType: defaultContent.contentType,
|
|
359
346
|
schema: defaultContent.schema,
|
|
360
|
-
contents:
|
|
347
|
+
contents: Option.some(contents)
|
|
361
348
|
});
|
|
362
349
|
};
|
|
363
350
|
var extractOutputSchema = (operation, r) => {
|
|
@@ -375,17 +362,63 @@ var extractOutputSchema = (operation, r) => {
|
|
|
375
362
|
}
|
|
376
363
|
return void 0;
|
|
377
364
|
};
|
|
378
|
-
var
|
|
365
|
+
var buildServerInputProperty = (servers) => {
|
|
366
|
+
const variableDefs = {};
|
|
367
|
+
for (const server of servers) {
|
|
368
|
+
for (const [name, v] of Object.entries(Option.getOrUndefined(server.variables) ?? {})) {
|
|
369
|
+
if (!(name in variableDefs)) variableDefs[name] = v;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
const hasMultiple = servers.length > 1;
|
|
373
|
+
const variableNames = Object.keys(variableDefs);
|
|
374
|
+
if (!hasMultiple && variableNames.length === 0) return void 0;
|
|
375
|
+
const properties = {};
|
|
376
|
+
if (hasMultiple) {
|
|
377
|
+
properties.url = {
|
|
378
|
+
type: "string",
|
|
379
|
+
enum: servers.map((server) => server.url),
|
|
380
|
+
default: servers[0].url,
|
|
381
|
+
description: "Which of the spec's servers to send the request to."
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
if (variableNames.length > 0) {
|
|
385
|
+
properties.variables = {
|
|
386
|
+
type: "object",
|
|
387
|
+
additionalProperties: false,
|
|
388
|
+
properties: Object.fromEntries(
|
|
389
|
+
Object.entries(variableDefs).map(([name, v]) => [
|
|
390
|
+
name,
|
|
391
|
+
{
|
|
392
|
+
type: "string",
|
|
393
|
+
default: v.default,
|
|
394
|
+
...Option.isSome(v.enum) ? { enum: v.enum.value } : {},
|
|
395
|
+
...Option.isSome(v.description) ? { description: v.description.value } : {}
|
|
396
|
+
}
|
|
397
|
+
])
|
|
398
|
+
),
|
|
399
|
+
description: "Values for the server URL `{variables}`; spec defaults apply when omitted."
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
type: "object",
|
|
404
|
+
additionalProperties: false,
|
|
405
|
+
properties,
|
|
406
|
+
description: "Optional host selection and server-URL variables for this request."
|
|
407
|
+
};
|
|
408
|
+
};
|
|
409
|
+
var buildInputSchema = (parameters, requestBody, servers) => {
|
|
379
410
|
const properties = {};
|
|
380
411
|
const required = [];
|
|
381
412
|
for (const param of parameters) {
|
|
382
|
-
properties[param.name] =
|
|
413
|
+
properties[param.name] = Option.getOrElse(param.schema, () => ({ type: "string" }));
|
|
383
414
|
if (param.required) required.push(param.name);
|
|
384
415
|
}
|
|
416
|
+
const serverProperty = buildServerInputProperty(servers);
|
|
417
|
+
if (serverProperty && !("server" in properties)) properties.server = serverProperty;
|
|
385
418
|
if (requestBody) {
|
|
386
|
-
properties.body =
|
|
419
|
+
properties.body = Option.getOrElse(requestBody.schema, () => ({ type: "object" }));
|
|
387
420
|
if (requestBody.required) required.push("body");
|
|
388
|
-
const contents =
|
|
421
|
+
const contents = Option.getOrUndefined(requestBody.contents);
|
|
389
422
|
if (contents && contents.length > 1) {
|
|
390
423
|
properties.contentType = {
|
|
391
424
|
type: "string",
|
|
@@ -424,8 +457,8 @@ var extractServerList = (servers) => (servers ?? []).flatMap((server) => {
|
|
|
424
457
|
name,
|
|
425
458
|
ServerVariable.make({
|
|
426
459
|
default: String(v.default),
|
|
427
|
-
enum: enumValues && enumValues.length > 0 ?
|
|
428
|
-
description:
|
|
460
|
+
enum: enumValues && enumValues.length > 0 ? Option.some(enumValues) : Option.none(),
|
|
461
|
+
description: Option.fromNullishOr(v.description)
|
|
429
462
|
})
|
|
430
463
|
]
|
|
431
464
|
];
|
|
@@ -434,18 +467,18 @@ var extractServerList = (servers) => (servers ?? []).flatMap((server) => {
|
|
|
434
467
|
return [
|
|
435
468
|
ServerInfo.make({
|
|
436
469
|
url: server.url,
|
|
437
|
-
description:
|
|
438
|
-
variables: vars && Object.keys(vars).length > 0 ?
|
|
470
|
+
description: Option.fromNullishOr(server.description),
|
|
471
|
+
variables: vars && Object.keys(vars).length > 0 ? Option.some(vars) : Option.none()
|
|
439
472
|
})
|
|
440
473
|
];
|
|
441
474
|
});
|
|
442
475
|
var extractServers = (doc) => extractServerList(doc.servers);
|
|
443
|
-
var
|
|
444
|
-
const
|
|
445
|
-
if (
|
|
446
|
-
const
|
|
447
|
-
if (
|
|
448
|
-
return
|
|
476
|
+
var operationServers = (pathItem, operation, docServers) => {
|
|
477
|
+
const operationLevel = extractServerList(operation.servers);
|
|
478
|
+
if (operationLevel.length > 0) return operationLevel;
|
|
479
|
+
const pathLevel = extractServerList(pathItem.servers);
|
|
480
|
+
if (pathLevel.length > 0) return pathLevel;
|
|
481
|
+
return docServers;
|
|
449
482
|
};
|
|
450
483
|
var extract = Effect2.fn("OpenApi.extract")(function* (doc) {
|
|
451
484
|
const paths = doc.paths;
|
|
@@ -455,6 +488,7 @@ var extract = Effect2.fn("OpenApi.extract")(function* (doc) {
|
|
|
455
488
|
});
|
|
456
489
|
}
|
|
457
490
|
const r = new DocResolver(doc);
|
|
491
|
+
const docServers = extractServers(doc);
|
|
458
492
|
const operations = [];
|
|
459
493
|
for (const [pathTemplate, pathItem] of Object.entries(paths).sort(
|
|
460
494
|
([a], [b]) => a.localeCompare(b)
|
|
@@ -465,39 +499,40 @@ var extract = Effect2.fn("OpenApi.extract")(function* (doc) {
|
|
|
465
499
|
if (!operation) continue;
|
|
466
500
|
const parameters = extractParameters(pathItem, operation, r);
|
|
467
501
|
const requestBody = extractRequestBody(operation, r);
|
|
468
|
-
const
|
|
502
|
+
const servers = operationServers(pathItem, operation, docServers);
|
|
503
|
+
const inputSchema = buildInputSchema(parameters, requestBody, servers);
|
|
469
504
|
const outputSchema = extractOutputSchema(operation, r);
|
|
470
505
|
const tags = (operation.tags ?? []).filter((t) => t.trim().length > 0);
|
|
471
506
|
const operationPathTemplate = explicitPathTemplate(operation) ?? pathTemplate;
|
|
472
507
|
operations.push(
|
|
473
508
|
ExtractedOperation.make({
|
|
474
509
|
operationId: OperationId.make(deriveOperationId(method, pathTemplate, operation)),
|
|
475
|
-
toolPath:
|
|
510
|
+
toolPath: Option.fromNullishOr(explicitToolPath(operation)),
|
|
476
511
|
method,
|
|
477
|
-
|
|
512
|
+
servers,
|
|
478
513
|
pathTemplate: operationPathTemplate,
|
|
479
|
-
summary:
|
|
480
|
-
description:
|
|
514
|
+
summary: Option.fromNullishOr(operation.summary),
|
|
515
|
+
description: Option.fromNullishOr(operation.description),
|
|
481
516
|
tags,
|
|
482
517
|
parameters,
|
|
483
|
-
requestBody:
|
|
484
|
-
inputSchema:
|
|
485
|
-
outputSchema:
|
|
518
|
+
requestBody: Option.fromNullishOr(requestBody),
|
|
519
|
+
inputSchema: Option.fromNullishOr(inputSchema),
|
|
520
|
+
outputSchema: Option.fromNullishOr(outputSchema),
|
|
486
521
|
deprecated: operation.deprecated === true
|
|
487
522
|
})
|
|
488
523
|
);
|
|
489
524
|
}
|
|
490
525
|
}
|
|
491
526
|
return ExtractionResult.make({
|
|
492
|
-
title:
|
|
493
|
-
version:
|
|
494
|
-
servers:
|
|
527
|
+
title: Option.fromNullishOr(doc.info?.title),
|
|
528
|
+
version: Option.fromNullishOr(doc.info?.version),
|
|
529
|
+
servers: docServers,
|
|
495
530
|
operations
|
|
496
531
|
});
|
|
497
532
|
});
|
|
498
533
|
|
|
499
534
|
// src/sdk/preview.ts
|
|
500
|
-
import { Effect as Effect3, Option as
|
|
535
|
+
import { Effect as Effect3, Option as Option2, Predicate } from "effect";
|
|
501
536
|
import { Schema as Schema4 } from "effect";
|
|
502
537
|
var OAuth2Scopes = Schema4.Record(Schema4.String, Schema4.String);
|
|
503
538
|
var SecuritySchemeType = Schema4.Literals(["http", "apiKey", "oauth2", "openIdConnect"]);
|
|
@@ -604,21 +639,21 @@ var stringRecord = (value) => {
|
|
|
604
639
|
return out;
|
|
605
640
|
};
|
|
606
641
|
var extractFlows = (rawFlows) => {
|
|
607
|
-
if (!rawFlows || typeof rawFlows !== "object") return
|
|
642
|
+
if (!rawFlows || typeof rawFlows !== "object") return Option2.none();
|
|
608
643
|
const flows = rawFlows;
|
|
609
644
|
const parseFlow = (key) => flows[key];
|
|
610
|
-
let authorizationCode =
|
|
645
|
+
let authorizationCode = Option2.none();
|
|
611
646
|
const authCodeRaw = parseFlow("authorizationCode");
|
|
612
647
|
if (authCodeRaw && typeof authCodeRaw === "object") {
|
|
613
648
|
const f = authCodeRaw;
|
|
614
649
|
const authUrl = typeof f.authorizationUrl === "string" ? f.authorizationUrl : null;
|
|
615
650
|
const tokenUrl = typeof f.tokenUrl === "string" ? f.tokenUrl : null;
|
|
616
651
|
if (authUrl && tokenUrl) {
|
|
617
|
-
authorizationCode =
|
|
652
|
+
authorizationCode = Option2.some(
|
|
618
653
|
OAuth2AuthorizationCodeFlow.make({
|
|
619
654
|
authorizationUrl: authUrl,
|
|
620
655
|
tokenUrl,
|
|
621
|
-
refreshUrl:
|
|
656
|
+
refreshUrl: Option2.fromNullishOr(
|
|
622
657
|
typeof f.refreshUrl === "string" ? f.refreshUrl : void 0
|
|
623
658
|
),
|
|
624
659
|
scopes: stringRecord(f.scopes)
|
|
@@ -626,16 +661,16 @@ var extractFlows = (rawFlows) => {
|
|
|
626
661
|
);
|
|
627
662
|
}
|
|
628
663
|
}
|
|
629
|
-
let clientCredentials =
|
|
664
|
+
let clientCredentials = Option2.none();
|
|
630
665
|
const ccRaw = parseFlow("clientCredentials");
|
|
631
666
|
if (ccRaw && typeof ccRaw === "object") {
|
|
632
667
|
const f = ccRaw;
|
|
633
668
|
const tokenUrl = typeof f.tokenUrl === "string" ? f.tokenUrl : null;
|
|
634
669
|
if (tokenUrl) {
|
|
635
|
-
clientCredentials =
|
|
670
|
+
clientCredentials = Option2.some(
|
|
636
671
|
OAuth2ClientCredentialsFlow.make({
|
|
637
672
|
tokenUrl,
|
|
638
|
-
refreshUrl:
|
|
673
|
+
refreshUrl: Option2.fromNullishOr(
|
|
639
674
|
typeof f.refreshUrl === "string" ? f.refreshUrl : void 0
|
|
640
675
|
),
|
|
641
676
|
scopes: stringRecord(f.scopes)
|
|
@@ -643,10 +678,10 @@ var extractFlows = (rawFlows) => {
|
|
|
643
678
|
);
|
|
644
679
|
}
|
|
645
680
|
}
|
|
646
|
-
if (
|
|
647
|
-
return
|
|
681
|
+
if (Option2.isNone(authorizationCode) && Option2.isNone(clientCredentials)) {
|
|
682
|
+
return Option2.none();
|
|
648
683
|
}
|
|
649
|
-
return
|
|
684
|
+
return Option2.some(OAuth2Flows.make({ authorizationCode, clientCredentials }));
|
|
650
685
|
};
|
|
651
686
|
var extractSecuritySchemes = (rawSchemes, resolver) => Object.entries(rawSchemes).flatMap(([name, schemeOrRef]) => {
|
|
652
687
|
if (!schemeOrRef || typeof schemeOrRef !== "object") return [];
|
|
@@ -656,19 +691,19 @@ var extractSecuritySchemes = (rawSchemes, resolver) => Object.entries(rawSchemes
|
|
|
656
691
|
if (!resolved || typeof resolved !== "object") return [];
|
|
657
692
|
const scheme = resolved;
|
|
658
693
|
const type = decodeSecuritySchemeType(scheme.type);
|
|
659
|
-
if (
|
|
694
|
+
if (Option2.isNone(type)) return [];
|
|
660
695
|
const schemeType = type.value;
|
|
661
696
|
return [
|
|
662
697
|
SecurityScheme.make({
|
|
663
698
|
name,
|
|
664
699
|
type: schemeType,
|
|
665
|
-
scheme:
|
|
666
|
-
bearerFormat:
|
|
667
|
-
in:
|
|
668
|
-
headerName:
|
|
669
|
-
description:
|
|
670
|
-
flows: schemeType === "oauth2" ? extractFlows(scheme.flows) :
|
|
671
|
-
openIdConnectUrl:
|
|
700
|
+
scheme: Option2.fromNullishOr(scheme.scheme),
|
|
701
|
+
bearerFormat: Option2.fromNullishOr(scheme.bearerFormat),
|
|
702
|
+
in: Option2.fromNullishOr(scheme.in),
|
|
703
|
+
headerName: Option2.fromNullishOr(scheme.name),
|
|
704
|
+
description: Option2.fromNullishOr(scheme.description),
|
|
705
|
+
flows: schemeType === "oauth2" ? extractFlows(scheme.flows) : Option2.none(),
|
|
706
|
+
openIdConnectUrl: Option2.fromNullishOr(scheme.openIdConnectUrl)
|
|
672
707
|
})
|
|
673
708
|
];
|
|
674
709
|
});
|
|
@@ -681,21 +716,21 @@ var buildHeaderPresets = (schemes, strategies) => {
|
|
|
681
716
|
const secretHeaders = [];
|
|
682
717
|
const labelParts = [];
|
|
683
718
|
for (const scheme of resolved) {
|
|
684
|
-
if (scheme.type === "http" &&
|
|
719
|
+
if (scheme.type === "http" && Option2.getOrElse(scheme.scheme, () => "") === "bearer") {
|
|
685
720
|
headers["Authorization"] = null;
|
|
686
721
|
secretHeaders.push("Authorization");
|
|
687
722
|
labelParts.push("Bearer Token");
|
|
688
|
-
} else if (scheme.type === "http" &&
|
|
723
|
+
} else if (scheme.type === "http" && Option2.getOrElse(scheme.scheme, () => "") === "basic") {
|
|
689
724
|
headers["Authorization"] = null;
|
|
690
725
|
secretHeaders.push("Authorization");
|
|
691
726
|
labelParts.push("Basic Auth");
|
|
692
|
-
} else if (scheme.type === "apiKey" &&
|
|
693
|
-
const headerName =
|
|
727
|
+
} else if (scheme.type === "apiKey" && Option2.getOrElse(scheme.in, () => "") === "header") {
|
|
728
|
+
const headerName = Option2.getOrElse(scheme.headerName, () => scheme.name);
|
|
694
729
|
headers[headerName] = null;
|
|
695
730
|
secretHeaders.push(headerName);
|
|
696
731
|
labelParts.push(scheme.name);
|
|
697
732
|
} else if (scheme.type === "apiKey") {
|
|
698
|
-
labelParts.push(`${scheme.name} (${
|
|
733
|
+
labelParts.push(`${scheme.name} (${Option2.getOrElse(scheme.in, () => "unknown")})`);
|
|
699
734
|
} else if (scheme.type === "oauth2" || scheme.type === "openIdConnect") {
|
|
700
735
|
return [];
|
|
701
736
|
} else {
|
|
@@ -724,16 +759,16 @@ var buildOAuth2Presets = (schemes) => {
|
|
|
724
759
|
const presets = [];
|
|
725
760
|
for (const scheme of schemes) {
|
|
726
761
|
if (scheme.type !== "oauth2") continue;
|
|
727
|
-
if (
|
|
762
|
+
if (Option2.isNone(scheme.flows)) continue;
|
|
728
763
|
const flows = scheme.flows.value;
|
|
729
|
-
if (
|
|
764
|
+
if (Option2.isSome(flows.authorizationCode)) {
|
|
730
765
|
const flow = flows.authorizationCode.value;
|
|
731
766
|
presets.push(
|
|
732
767
|
OAuth2Preset.make({
|
|
733
768
|
label: `OAuth2 Authorization Code \xB7 ${scheme.name}`,
|
|
734
769
|
securitySchemeName: scheme.name,
|
|
735
770
|
flow: "authorizationCode",
|
|
736
|
-
authorizationUrl:
|
|
771
|
+
authorizationUrl: Option2.some(flow.authorizationUrl),
|
|
737
772
|
tokenUrl: flow.tokenUrl,
|
|
738
773
|
refreshUrl: flow.refreshUrl,
|
|
739
774
|
scopes: flow.scopes,
|
|
@@ -741,14 +776,14 @@ var buildOAuth2Presets = (schemes) => {
|
|
|
741
776
|
})
|
|
742
777
|
);
|
|
743
778
|
}
|
|
744
|
-
if (
|
|
779
|
+
if (Option2.isSome(flows.clientCredentials)) {
|
|
745
780
|
const flow = flows.clientCredentials.value;
|
|
746
781
|
presets.push(
|
|
747
782
|
OAuth2Preset.make({
|
|
748
783
|
label: `OAuth2 Client Credentials \xB7 ${scheme.name}`,
|
|
749
784
|
securitySchemeName: scheme.name,
|
|
750
785
|
flow: "clientCredentials",
|
|
751
|
-
authorizationUrl:
|
|
786
|
+
authorizationUrl: Option2.none(),
|
|
752
787
|
tokenUrl: flow.tokenUrl,
|
|
753
788
|
refreshUrl: flow.refreshUrl,
|
|
754
789
|
scopes: flow.scopes,
|
|
@@ -766,8 +801,7 @@ var collectTags = (result) => {
|
|
|
766
801
|
}
|
|
767
802
|
return [...tagSet].sort();
|
|
768
803
|
};
|
|
769
|
-
var
|
|
770
|
-
const specText = yield* resolveSpecText(input);
|
|
804
|
+
var previewSpecText = Effect3.fn("OpenApi.previewSpecText")(function* (specText) {
|
|
771
805
|
const doc = yield* parse(specText);
|
|
772
806
|
const result = yield* extract(doc);
|
|
773
807
|
const resolver = new DocResolver(doc);
|
|
@@ -799,10 +833,25 @@ var previewSpec = Effect3.fn("OpenApi.previewSpec")(function* (input) {
|
|
|
799
833
|
oauth2Presets: buildOAuth2Presets(securitySchemes)
|
|
800
834
|
});
|
|
801
835
|
});
|
|
836
|
+
var previewSpec = Effect3.fn("OpenApi.previewSpec")(function* (input) {
|
|
837
|
+
const specText = yield* resolveSpecText(input);
|
|
838
|
+
return yield* previewSpecText(specText);
|
|
839
|
+
});
|
|
802
840
|
|
|
803
841
|
export {
|
|
804
|
-
|
|
805
|
-
|
|
842
|
+
OpenApiParseError,
|
|
843
|
+
OpenApiExtractionError,
|
|
844
|
+
OpenApiInvocationError,
|
|
845
|
+
OpenApiOAuthError,
|
|
846
|
+
OpenApiAuthRequiredError,
|
|
847
|
+
fetchSpecText,
|
|
848
|
+
resolveSpecText,
|
|
849
|
+
parse,
|
|
850
|
+
DocResolver,
|
|
851
|
+
substituteUrlVariables,
|
|
852
|
+
resolveServerUrl,
|
|
853
|
+
preferredContent,
|
|
854
|
+
normalizeOpenApiAuthInputs,
|
|
806
855
|
OperationId,
|
|
807
856
|
HttpMethod,
|
|
808
857
|
ParameterLocation,
|
|
@@ -810,25 +859,13 @@ export {
|
|
|
810
859
|
EncodingObject,
|
|
811
860
|
MediaBinding,
|
|
812
861
|
OperationRequestBody,
|
|
813
|
-
ExtractedOperation,
|
|
814
862
|
ServerVariable,
|
|
815
863
|
ServerInfo,
|
|
864
|
+
ExtractedOperation,
|
|
816
865
|
ExtractionResult,
|
|
817
866
|
OperationBinding,
|
|
818
867
|
InvocationResult,
|
|
819
|
-
|
|
820
|
-
OpenApiExtractionError,
|
|
821
|
-
OpenApiInvocationError,
|
|
822
|
-
OpenApiOAuthError,
|
|
823
|
-
OpenApiAuthRequiredError,
|
|
824
|
-
fetchSpecText,
|
|
825
|
-
resolveSpecText,
|
|
826
|
-
parse,
|
|
827
|
-
DocResolver,
|
|
828
|
-
substituteUrlVariables,
|
|
829
|
-
expandServerUrlOptions,
|
|
830
|
-
resolveBaseUrl,
|
|
831
|
-
preferredContent,
|
|
868
|
+
TOKEN_VARIABLE,
|
|
832
869
|
extract,
|
|
833
870
|
OAuth2AuthorizationCodeFlow,
|
|
834
871
|
OAuth2ClientCredentialsFlow,
|
|
@@ -839,6 +876,7 @@ export {
|
|
|
839
876
|
OAuth2Preset,
|
|
840
877
|
PreviewOperation,
|
|
841
878
|
SpecPreview,
|
|
879
|
+
previewSpecText,
|
|
842
880
|
previewSpec
|
|
843
881
|
};
|
|
844
|
-
//# sourceMappingURL=chunk-
|
|
882
|
+
//# sourceMappingURL=chunk-C3IJX4AN.js.map
|