@executor-js/plugin-openapi 1.4.29 → 1.4.30
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-FLMNI742.js → AddOpenApiSource-KSOMPQ2R.js} +4 -4
- package/dist/{EditOpenApiSource-I4NIGIIJ.js → EditOpenApiSource-AOA7APR2.js} +301 -192
- package/dist/EditOpenApiSource-AOA7APR2.js.map +1 -0
- package/dist/{OpenApiSourceSummary-CM46DB4L.js → OpenApiSourceSummary-Y3S6ZBOZ.js} +4 -4
- package/dist/OpenApiSourceSummary-Y3S6ZBOZ.js.map +1 -0
- package/dist/api/group.d.ts +124 -118
- package/dist/api/index.d.ts +148 -369
- package/dist/chunk-BB5IAKRG.js +136 -0
- package/dist/chunk-BB5IAKRG.js.map +1 -0
- package/dist/{chunk-E7PZ2QGD.js → chunk-EOXXE5DG.js} +17 -455
- package/dist/chunk-EOXXE5DG.js.map +1 -0
- package/dist/{chunk-OZ67JNID.js → chunk-NIKLYJ3X.js} +830 -319
- package/dist/chunk-NIKLYJ3X.js.map +1 -0
- package/dist/{chunk-TGDT6QCH.js → chunk-YJMXYKYX.js} +178 -117
- package/dist/chunk-YJMXYKYX.js.map +1 -0
- package/dist/{chunk-GFQUEZUW.js → chunk-ZZBTLFTA.js} +78 -93
- package/dist/chunk-ZZBTLFTA.js.map +1 -0
- package/dist/client.js +7 -137
- package/dist/client.js.map +1 -1
- package/dist/core.js +5 -10
- package/dist/index.js +3 -2
- package/dist/react/atoms.d.ts +83 -223
- package/dist/react/client.d.ts +123 -117
- package/dist/sdk/credential-status.d.ts +3 -3
- package/dist/sdk/extract.d.ts +19 -19
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/invoke.d.ts +7 -7
- package/dist/sdk/parse.d.ts +2 -3
- package/dist/sdk/plugin.d.ts +181 -275
- package/dist/sdk/preview.d.ts +12 -12
- package/dist/sdk/source-contracts.d.ts +55 -0
- package/dist/sdk/store.d.ts +6 -269
- package/dist/sdk/types.d.ts +16 -65
- package/dist/testing/index.d.ts +149 -11
- package/dist/testing.js +419 -33
- package/dist/testing.js.map +1 -1
- package/dist/testing.test.d.ts +1 -0
- package/package.json +3 -4
- package/dist/EditOpenApiSource-I4NIGIIJ.js.map +0 -1
- package/dist/OpenApiSourceSummary-CM46DB4L.js.map +0 -1
- package/dist/chunk-E7PZ2QGD.js.map +0 -1
- package/dist/chunk-GFQUEZUW.js.map +0 -1
- package/dist/chunk-OZ67JNID.js.map +0 -1
- package/dist/chunk-TGDT6QCH.js.map +0 -1
- /package/dist/{AddOpenApiSource-FLMNI742.js.map → AddOpenApiSource-KSOMPQ2R.js.map} +0 -0
package/dist/testing.js
CHANGED
|
@@ -1,56 +1,442 @@
|
|
|
1
1
|
// src/testing/index.ts
|
|
2
|
-
import { Context, Data, Effect, Layer, Predicate, Schema } from "effect";
|
|
3
|
-
import {
|
|
2
|
+
import { Context, Data, Effect, Layer, Option, Predicate, Ref, Schema } from "effect";
|
|
3
|
+
import {
|
|
4
|
+
HttpRouter,
|
|
5
|
+
HttpServerRequest,
|
|
6
|
+
HttpServerResponse
|
|
7
|
+
} from "effect/unstable/http";
|
|
8
|
+
import {
|
|
9
|
+
HttpApi,
|
|
10
|
+
HttpApiBuilder,
|
|
11
|
+
HttpApiEndpoint,
|
|
12
|
+
HttpApiGroup,
|
|
13
|
+
OpenApi
|
|
14
|
+
} from "effect/unstable/httpapi";
|
|
15
|
+
import { OAuthTestServer, serveTestHttpServerLayer } from "@executor-js/sdk/testing";
|
|
16
|
+
import { isToolResult } from "@executor-js/sdk/core";
|
|
4
17
|
var OpenApiTestServerAddressError = class extends Data.TaggedError(
|
|
5
18
|
"OpenApiTestServerAddressError"
|
|
6
19
|
) {
|
|
7
20
|
};
|
|
8
21
|
var OpenApiTestServerSpecError = class extends Data.TaggedError("OpenApiTestServerSpecError") {
|
|
9
22
|
};
|
|
10
|
-
var
|
|
23
|
+
var makeOpenApiTestSpecJson = (api, options = {}) => {
|
|
24
|
+
const annotations = OpenApi.annotations({
|
|
25
|
+
...options.baseUrl !== void 0 ? { servers: [{ url: options.baseUrl }] } : {},
|
|
26
|
+
transform: options.transformSpec
|
|
27
|
+
});
|
|
28
|
+
const annotated = api.annotateMerge(annotations);
|
|
29
|
+
return JSON.stringify(OpenApi.fromApi(annotated));
|
|
30
|
+
};
|
|
31
|
+
var makeOpenApiTestSourceConfig = (server, options) => {
|
|
32
|
+
const { baseUrl, ...rest } = options;
|
|
33
|
+
return {
|
|
34
|
+
...rest,
|
|
35
|
+
spec: { kind: "blob", value: server.specJson },
|
|
36
|
+
name: rest.name ?? "Test API",
|
|
37
|
+
namespace: rest.namespace ?? "test_api",
|
|
38
|
+
...baseUrl === null ? {} : { baseUrl: baseUrl ?? server.baseUrl }
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
var addOpenApiTestSource = (executor, server, options) => executor.openapi.addSpec(makeOpenApiTestSourceConfig(server, options));
|
|
42
|
+
var makeOpenApiHttpApiTestSourceConfig = (api, options) => {
|
|
43
|
+
const { baseUrl, specBaseUrl, transformSpec, ...config } = options;
|
|
44
|
+
return {
|
|
45
|
+
...config,
|
|
46
|
+
spec: {
|
|
47
|
+
kind: "blob",
|
|
48
|
+
value: makeOpenApiTestSpecJson(api, { baseUrl: specBaseUrl, transformSpec })
|
|
49
|
+
},
|
|
50
|
+
name: config.name ?? "Test API",
|
|
51
|
+
namespace: config.namespace ?? "test_api",
|
|
52
|
+
...baseUrl === null ? {} : { baseUrl: baseUrl ?? specBaseUrl ?? "https://api.example.test" }
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
var addOpenApiHttpApiTestSource = (executor, api, options) => executor.openapi.addSpec(makeOpenApiHttpApiTestSourceConfig(api, options));
|
|
56
|
+
var makeOpenApiHttpApiTestAddSpecPayload = (api, options) => {
|
|
57
|
+
const { ...sourceOptions } = options;
|
|
58
|
+
const config = makeOpenApiHttpApiTestSourceConfig(api, {
|
|
59
|
+
...sourceOptions,
|
|
60
|
+
scope: "unused-http-helper-scope"
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
spec: config.spec,
|
|
64
|
+
namespace: config.namespace,
|
|
65
|
+
name: config.name,
|
|
66
|
+
baseUrl: config.baseUrl,
|
|
67
|
+
...sourceOptions.headers !== void 0 ? { headers: sourceOptions.headers } : {},
|
|
68
|
+
...sourceOptions.queryParams !== void 0 ? { queryParams: sourceOptions.queryParams } : {},
|
|
69
|
+
...config.oauth2 !== void 0 ? { oauth2: config.oauth2 } : {},
|
|
70
|
+
...sourceOptions.specFetchCredentials !== void 0 ? { specFetchCredentials: sourceOptions.specFetchCredentials } : {}
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
var makeOpenApiHttpApiTestSpecPayload = (api, options = {}) => ({
|
|
74
|
+
spec: makeOpenApiTestSpecJson(api, options)
|
|
75
|
+
});
|
|
11
76
|
var isJsonObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
77
|
+
var OpenApiEchoItem = Schema.Struct({
|
|
78
|
+
id: Schema.Number,
|
|
79
|
+
name: Schema.String
|
|
80
|
+
});
|
|
81
|
+
var OpenApiEchoHeaders = Schema.Struct({
|
|
82
|
+
authorization: Schema.optional(Schema.String),
|
|
83
|
+
"x-static": Schema.optional(Schema.String)
|
|
84
|
+
});
|
|
85
|
+
var OpenApiEchoMessage = Schema.Struct({
|
|
86
|
+
message: Schema.String,
|
|
87
|
+
suffix: Schema.optional(Schema.String),
|
|
88
|
+
path: Schema.String
|
|
89
|
+
});
|
|
90
|
+
var OpenApiEchoItemsGroup = HttpApiGroup.make("items").add(
|
|
91
|
+
HttpApiEndpoint.get("listItems", "/items", {
|
|
92
|
+
success: Schema.Array(OpenApiEchoItem)
|
|
93
|
+
})
|
|
94
|
+
).add(
|
|
95
|
+
HttpApiEndpoint.get("echoHeaders", "/echo-headers", {
|
|
96
|
+
success: OpenApiEchoHeaders
|
|
97
|
+
})
|
|
98
|
+
);
|
|
99
|
+
var OpenApiEchoGroup = HttpApiGroup.make("echo").add(
|
|
100
|
+
HttpApiEndpoint.get("echoMessage", "/echo/:message", {
|
|
101
|
+
params: Schema.Struct({ message: Schema.String }),
|
|
102
|
+
query: Schema.Struct({ suffix: Schema.optional(Schema.String) }),
|
|
103
|
+
success: OpenApiEchoMessage
|
|
104
|
+
})
|
|
105
|
+
);
|
|
106
|
+
var OpenApiEchoApi = HttpApi.make("executorOpenApiTest").add(OpenApiEchoItemsGroup).add(OpenApiEchoGroup).annotateMerge(
|
|
107
|
+
OpenApi.annotations({
|
|
108
|
+
title: "Executor OpenAPI Test Server",
|
|
109
|
+
version: "1.0.0"
|
|
110
|
+
})
|
|
111
|
+
);
|
|
112
|
+
var openApiSpecJsonFromHttpApi = (api, baseUrl, transformSpec) => Effect.try({
|
|
113
|
+
try: () => makeOpenApiTestSpecJson(api, { baseUrl, transformSpec }),
|
|
114
|
+
catch: (cause) => new OpenApiTestServerSpecError({ cause })
|
|
115
|
+
});
|
|
116
|
+
var serveOpenApiHttpApiTestServer = (options) => Effect.gen(function* () {
|
|
117
|
+
const specPath = options.specPath ?? "/spec.json";
|
|
118
|
+
let specJson = "";
|
|
119
|
+
const SpecRoute = HttpRouter.addAll([
|
|
120
|
+
HttpRouter.route(
|
|
121
|
+
"GET",
|
|
122
|
+
specPath,
|
|
123
|
+
Effect.gen(function* () {
|
|
124
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
125
|
+
if (options.captureSpecRequest) {
|
|
126
|
+
yield* options.captureSpecRequest(request);
|
|
127
|
+
}
|
|
128
|
+
const guardResponse = options.guardSpecRequest ? yield* options.guardSpecRequest(request) : null;
|
|
129
|
+
if (guardResponse) return guardResponse;
|
|
130
|
+
return HttpServerResponse.text(specJson, {
|
|
131
|
+
status: 200,
|
|
132
|
+
contentType: "application/json"
|
|
133
|
+
});
|
|
134
|
+
})
|
|
135
|
+
)
|
|
136
|
+
]);
|
|
137
|
+
const ApiLive = HttpApiBuilder.layer(options.api).pipe(
|
|
138
|
+
Layer.provide(options.handlersLayer)
|
|
139
|
+
);
|
|
140
|
+
const ServerLayer = HttpRouter.serve(Layer.mergeAll(ApiLive, SpecRoute), {
|
|
141
|
+
disableListenLog: true,
|
|
142
|
+
disableLogger: true
|
|
23
143
|
});
|
|
144
|
+
const server = yield* serveTestHttpServerLayer(ServerLayer).pipe(
|
|
145
|
+
Effect.mapError(
|
|
146
|
+
(error) => Predicate.isTagged(error, "TestHttpServerAddressError") ? new OpenApiTestServerAddressError({ address: error.address }) : new OpenApiTestServerSpecError({ cause: error.cause })
|
|
147
|
+
)
|
|
148
|
+
);
|
|
149
|
+
specJson = yield* openApiSpecJsonFromHttpApi(
|
|
150
|
+
options.api,
|
|
151
|
+
server.baseUrl,
|
|
152
|
+
options.transformSpec
|
|
153
|
+
);
|
|
154
|
+
return {
|
|
155
|
+
baseUrl: server.baseUrl,
|
|
156
|
+
specUrl: server.url(specPath),
|
|
157
|
+
specJson,
|
|
158
|
+
httpClientLayer: server.httpClientLayer
|
|
159
|
+
};
|
|
24
160
|
});
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
161
|
+
var OpenApiHttpApiTestServer = class _OpenApiHttpApiTestServer extends Context.Service()("@executor-js/plugin-openapi/testing/OpenApiHttpApiTestServer") {
|
|
162
|
+
static layer = (options) => Layer.effect(_OpenApiHttpApiTestServer, serveOpenApiHttpApiTestServer(options));
|
|
163
|
+
};
|
|
164
|
+
var serveMutableOpenApiSpecTestServer = (options) => Effect.gen(function* () {
|
|
165
|
+
const specPath = options.specPath ?? "/spec.json";
|
|
166
|
+
const specJson = yield* Ref.make("");
|
|
167
|
+
const requests = yield* Ref.make(0);
|
|
168
|
+
const SpecRoute = HttpRouter.addAll([
|
|
169
|
+
HttpRouter.route(
|
|
170
|
+
"GET",
|
|
171
|
+
specPath,
|
|
172
|
+
Effect.gen(function* () {
|
|
173
|
+
yield* Ref.update(requests, (count) => count + 1);
|
|
174
|
+
const current = yield* Ref.get(specJson);
|
|
175
|
+
return HttpServerResponse.text(current, {
|
|
176
|
+
status: 200,
|
|
177
|
+
contentType: "application/json"
|
|
178
|
+
});
|
|
179
|
+
})
|
|
180
|
+
)
|
|
181
|
+
]);
|
|
182
|
+
const server = yield* serveTestHttpServerLayer(
|
|
183
|
+
HttpRouter.serve(SpecRoute, {
|
|
184
|
+
disableListenLog: true,
|
|
185
|
+
disableLogger: true
|
|
186
|
+
})
|
|
187
|
+
).pipe(
|
|
188
|
+
Effect.mapError(
|
|
189
|
+
(error) => Predicate.isTagged(error, "TestHttpServerAddressError") ? new OpenApiTestServerAddressError({ address: error.address }) : new OpenApiTestServerSpecError({ cause: error.cause })
|
|
190
|
+
)
|
|
191
|
+
);
|
|
192
|
+
const renderSpec = (api) => openApiSpecJsonFromHttpApi(api, server.baseUrl, options.transformSpec);
|
|
193
|
+
yield* Ref.set(specJson, yield* renderSpec(options.initialApi));
|
|
194
|
+
return {
|
|
195
|
+
baseUrl: server.baseUrl,
|
|
196
|
+
specUrl: server.url(specPath),
|
|
197
|
+
specJson: yield* Ref.get(specJson),
|
|
198
|
+
httpClientLayer: server.httpClientLayer,
|
|
199
|
+
setApi: (api) => renderSpec(api).pipe(Effect.flatMap((next) => Ref.set(specJson, next))),
|
|
200
|
+
requestCount: Ref.get(requests)
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
var openApiOperationMethods = /* @__PURE__ */ new Set([
|
|
204
|
+
"get",
|
|
205
|
+
"put",
|
|
206
|
+
"post",
|
|
207
|
+
"delete",
|
|
208
|
+
"options",
|
|
209
|
+
"head",
|
|
210
|
+
"patch"
|
|
211
|
+
]);
|
|
212
|
+
var withOAuth2Security = (oauth2) => (spec) => {
|
|
213
|
+
const scopes = oauth2.scopes ?? { read: "Read test resources" };
|
|
214
|
+
const security = [{ oauth2: Object.keys(scopes) }];
|
|
215
|
+
const paths = isJsonObject(spec.paths) ? Object.fromEntries(
|
|
216
|
+
Object.entries(spec.paths).map(([path, pathItem]) => [
|
|
217
|
+
path,
|
|
218
|
+
isJsonObject(pathItem) ? Object.fromEntries(
|
|
219
|
+
Object.entries(pathItem).map(([method, operation]) => [
|
|
220
|
+
method,
|
|
221
|
+
openApiOperationMethods.has(method) && isJsonObject(operation) ? { ...operation, security } : operation
|
|
222
|
+
])
|
|
223
|
+
) : pathItem
|
|
224
|
+
])
|
|
225
|
+
) : spec.paths;
|
|
226
|
+
const components = isJsonObject(spec.components) ? spec.components : {};
|
|
227
|
+
const securitySchemes = isJsonObject(components.securitySchemes) ? components.securitySchemes : {};
|
|
228
|
+
return {
|
|
229
|
+
...spec,
|
|
230
|
+
paths,
|
|
231
|
+
components: {
|
|
232
|
+
...components,
|
|
233
|
+
securitySchemes: {
|
|
234
|
+
...securitySchemes,
|
|
235
|
+
oauth2: {
|
|
236
|
+
type: "oauth2",
|
|
237
|
+
flows: {
|
|
238
|
+
authorizationCode: {
|
|
239
|
+
authorizationUrl: oauth2.authorizationUrl,
|
|
240
|
+
tokenUrl: oauth2.tokenUrl,
|
|
241
|
+
scopes
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
};
|
|
249
|
+
var composeSpecTransforms = (...transforms) => (spec) => transforms.reduce((current, transform) => transform ? transform(current) : current, spec);
|
|
250
|
+
var recordOpenApiRequest = (requests, request) => Effect.gen(function* () {
|
|
251
|
+
const url = new URL(request.url, "http://executor.test");
|
|
252
|
+
const body = yield* request.text.pipe(Effect.catch(() => Effect.succeed("")));
|
|
253
|
+
yield* Ref.update(requests, (all) => [
|
|
254
|
+
...all,
|
|
255
|
+
{
|
|
256
|
+
method: request.method,
|
|
257
|
+
url: request.url,
|
|
258
|
+
path: url.pathname,
|
|
259
|
+
headers: request.headers,
|
|
260
|
+
body
|
|
261
|
+
}
|
|
262
|
+
]);
|
|
263
|
+
return request;
|
|
264
|
+
});
|
|
265
|
+
var captureOpenApiRequest = (requests) => Effect.gen(function* () {
|
|
266
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
267
|
+
return yield* recordOpenApiRequest(requests, request);
|
|
268
|
+
});
|
|
269
|
+
var openApiUnauthorizedResponse = (options, authorization) => options.oauth2?.validateAuthorization ? options.oauth2.validateAuthorization(authorization).pipe(
|
|
270
|
+
Effect.map(
|
|
271
|
+
(accepted) => accepted ? null : HttpServerResponse.jsonUnsafe(
|
|
272
|
+
{ error: "invalid_token" },
|
|
273
|
+
options.oauth2?.wwwAuthenticate ? {
|
|
274
|
+
status: 401,
|
|
275
|
+
headers: {
|
|
276
|
+
"www-authenticate": options.oauth2.wwwAuthenticate
|
|
277
|
+
}
|
|
278
|
+
} : { status: 401 }
|
|
279
|
+
)
|
|
280
|
+
)
|
|
281
|
+
) : Effect.succeed(null);
|
|
282
|
+
var makeOpenApiEchoItemsGroupLive = (requests, options) => HttpApiBuilder.group(
|
|
283
|
+
OpenApiEchoApi,
|
|
284
|
+
"items",
|
|
285
|
+
(handlers) => handlers.handle(
|
|
286
|
+
"listItems",
|
|
287
|
+
() => Effect.gen(function* () {
|
|
288
|
+
const request = yield* captureOpenApiRequest(requests);
|
|
289
|
+
const unauthorized = yield* openApiUnauthorizedResponse(
|
|
290
|
+
options,
|
|
291
|
+
request.headers.authorization ?? null
|
|
292
|
+
);
|
|
293
|
+
if (unauthorized) return unauthorized;
|
|
294
|
+
return [
|
|
295
|
+
OpenApiEchoItem.make({ id: 1, name: "Widget" }),
|
|
296
|
+
OpenApiEchoItem.make({ id: 2, name: "Gadget" })
|
|
297
|
+
];
|
|
298
|
+
})
|
|
299
|
+
).handle(
|
|
300
|
+
"echoHeaders",
|
|
301
|
+
() => Effect.gen(function* () {
|
|
302
|
+
const request = yield* captureOpenApiRequest(requests);
|
|
303
|
+
const unauthorized = yield* openApiUnauthorizedResponse(
|
|
304
|
+
options,
|
|
305
|
+
request.headers.authorization ?? null
|
|
306
|
+
);
|
|
307
|
+
if (unauthorized) return unauthorized;
|
|
308
|
+
return OpenApiEchoHeaders.make({
|
|
309
|
+
authorization: request.headers.authorization,
|
|
310
|
+
"x-static": request.headers["x-static"]
|
|
311
|
+
});
|
|
312
|
+
})
|
|
313
|
+
)
|
|
314
|
+
);
|
|
315
|
+
var makeOpenApiEchoGroupLive = (requests, options) => HttpApiBuilder.group(
|
|
316
|
+
OpenApiEchoApi,
|
|
317
|
+
"echo",
|
|
318
|
+
(handlers) => handlers.handle(
|
|
319
|
+
"echoMessage",
|
|
320
|
+
({ params, query }) => Effect.gen(function* () {
|
|
321
|
+
const request = yield* captureOpenApiRequest(requests);
|
|
322
|
+
const unauthorized = yield* openApiUnauthorizedResponse(
|
|
323
|
+
options,
|
|
324
|
+
request.headers.authorization ?? null
|
|
325
|
+
);
|
|
326
|
+
if (unauthorized) return unauthorized;
|
|
327
|
+
const path = `/echo/${encodeURIComponent(params.message)}`;
|
|
328
|
+
return OpenApiEchoMessage.make({
|
|
329
|
+
message: params.message,
|
|
330
|
+
...query.suffix ? { suffix: query.suffix } : {},
|
|
331
|
+
path
|
|
332
|
+
});
|
|
333
|
+
})
|
|
334
|
+
)
|
|
335
|
+
);
|
|
336
|
+
var serveOpenApiEchoTestServer = (options = {}) => Effect.gen(function* () {
|
|
337
|
+
const requests = yield* Ref.make([]);
|
|
338
|
+
let specJson = "";
|
|
339
|
+
const server = yield* serveOpenApiHttpApiTestServer({
|
|
340
|
+
api: OpenApiEchoApi,
|
|
341
|
+
handlersLayer: Layer.mergeAll(
|
|
342
|
+
makeOpenApiEchoItemsGroupLive(requests, options),
|
|
343
|
+
makeOpenApiEchoGroupLive(requests, options)
|
|
344
|
+
),
|
|
345
|
+
transformSpec: composeSpecTransforms(
|
|
346
|
+
options.oauth2 ? withOAuth2Security(options.oauth2) : void 0,
|
|
347
|
+
options.transformSpec
|
|
348
|
+
),
|
|
349
|
+
captureSpecRequest: (request) => recordOpenApiRequest(requests, request).pipe(Effect.asVoid)
|
|
350
|
+
});
|
|
351
|
+
specJson = server.specJson;
|
|
34
352
|
return {
|
|
35
|
-
baseUrl,
|
|
353
|
+
baseUrl: server.baseUrl,
|
|
354
|
+
specUrl: server.specUrl,
|
|
36
355
|
specJson,
|
|
37
|
-
httpClientLayer:
|
|
356
|
+
httpClientLayer: server.httpClientLayer,
|
|
357
|
+
requests: Ref.get(requests),
|
|
358
|
+
clearRequests: Ref.set(requests, [])
|
|
38
359
|
};
|
|
39
360
|
});
|
|
40
|
-
var
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
361
|
+
var serveOpenApiEchoTestServerWithOAuth = (options = {}) => Effect.gen(function* () {
|
|
362
|
+
const oauth = yield* OAuthTestServer;
|
|
363
|
+
return yield* serveOpenApiEchoTestServer({
|
|
364
|
+
transformSpec: options.transformSpec,
|
|
365
|
+
oauth2: {
|
|
366
|
+
authorizationUrl: oauth.authorizationEndpoint,
|
|
367
|
+
tokenUrl: oauth.tokenEndpoint,
|
|
368
|
+
scopes: options.scopes,
|
|
369
|
+
validateAuthorization: oauth.acceptsAuthorizationHeader,
|
|
370
|
+
wwwAuthenticate: options.wwwAuthenticate
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
var OpenApiEchoTestServer = class _OpenApiEchoTestServer extends Context.Service()("@executor-js/plugin-openapi/testing/OpenApiEchoTestServer") {
|
|
375
|
+
static layer = (options) => Layer.effect(_OpenApiEchoTestServer, serveOpenApiEchoTestServer(options));
|
|
376
|
+
static layerWithOAuth = (options) => Layer.effect(_OpenApiEchoTestServer, serveOpenApiEchoTestServerWithOAuth(options));
|
|
44
377
|
};
|
|
45
378
|
var TestLayers = {
|
|
46
|
-
|
|
379
|
+
httpApi: OpenApiHttpApiTestServer.layer,
|
|
380
|
+
echo: OpenApiEchoTestServer.layer,
|
|
381
|
+
echoWithOAuth: OpenApiEchoTestServer.layerWithOAuth
|
|
382
|
+
};
|
|
383
|
+
var OpenApiTransportEnvelope = Schema.Struct({
|
|
384
|
+
status: Schema.Number,
|
|
385
|
+
headers: Schema.Record(Schema.String, Schema.String),
|
|
386
|
+
data: Schema.Unknown
|
|
387
|
+
});
|
|
388
|
+
var decodeOpenApiTransportEnvelope = Schema.decodeUnknownOption(OpenApiTransportEnvelope);
|
|
389
|
+
var unwrapInvocation = (raw) => {
|
|
390
|
+
if (!isToolResult(raw)) {
|
|
391
|
+
return {
|
|
392
|
+
status: null,
|
|
393
|
+
headers: null,
|
|
394
|
+
data: raw,
|
|
395
|
+
error: null
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
if (raw.ok) {
|
|
399
|
+
const inner = raw.data;
|
|
400
|
+
const wrapped = Option.getOrUndefined(decodeOpenApiTransportEnvelope(inner));
|
|
401
|
+
if (wrapped !== void 0) {
|
|
402
|
+
return {
|
|
403
|
+
status: wrapped.status,
|
|
404
|
+
headers: wrapped.headers,
|
|
405
|
+
data: wrapped.data,
|
|
406
|
+
error: null
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
status: null,
|
|
411
|
+
headers: null,
|
|
412
|
+
data: inner,
|
|
413
|
+
error: null
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
status: raw.error.status ?? null,
|
|
418
|
+
headers: null,
|
|
419
|
+
data: null,
|
|
420
|
+
error: raw.error.details ?? raw.error
|
|
421
|
+
};
|
|
47
422
|
};
|
|
48
423
|
export {
|
|
49
|
-
|
|
424
|
+
OpenApiEchoTestServer,
|
|
425
|
+
OpenApiHttpApiTestServer,
|
|
50
426
|
OpenApiTestServerAddressError,
|
|
51
427
|
OpenApiTestServerSpecError,
|
|
52
428
|
TestLayers,
|
|
53
|
-
|
|
54
|
-
|
|
429
|
+
addOpenApiHttpApiTestSource,
|
|
430
|
+
addOpenApiTestSource,
|
|
431
|
+
makeOpenApiHttpApiTestAddSpecPayload,
|
|
432
|
+
makeOpenApiHttpApiTestSourceConfig,
|
|
433
|
+
makeOpenApiHttpApiTestSpecPayload,
|
|
434
|
+
makeOpenApiTestSourceConfig,
|
|
435
|
+
makeOpenApiTestSpecJson,
|
|
436
|
+
serveMutableOpenApiSpecTestServer,
|
|
437
|
+
serveOpenApiEchoTestServer,
|
|
438
|
+
serveOpenApiEchoTestServerWithOAuth,
|
|
439
|
+
serveOpenApiHttpApiTestServer,
|
|
440
|
+
unwrapInvocation
|
|
55
441
|
};
|
|
56
442
|
//# sourceMappingURL=testing.js.map
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testing/index.ts"],"sourcesContent":["import { Context, Data, Effect, Layer, Predicate, Schema } from \"effect\";\nimport { HttpClient, HttpServer } from \"effect/unstable/http\";\n\nexport class OpenApiTestServerAddressError extends Data.TaggedError(\n \"OpenApiTestServerAddressError\",\n)<{\n readonly address: unknown;\n}> {}\n\nexport class OpenApiTestServerSpecError extends Data.TaggedError(\"OpenApiTestServerSpecError\")<{\n readonly cause: unknown;\n}> {}\n\nexport interface OpenApiTestServerOptions {\n readonly spec: unknown;\n}\n\nexport interface OpenApiTestServerShape {\n readonly baseUrl: string;\n readonly specJson: string;\n readonly httpClientLayer: Layer.Layer<HttpClient.HttpClient, never, never>;\n}\n\nconst decodeJsonSpec = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));\n\nconst isJsonObject = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nexport const openApiSpecJsonWithServer = (\n spec: unknown,\n baseUrl: string,\n): Effect.Effect<string, OpenApiTestServerSpecError> =>\n Effect.gen(function* () {\n const parsed =\n typeof spec === \"string\"\n ? yield* decodeJsonSpec(spec).pipe(\n Effect.mapError((cause) => new OpenApiTestServerSpecError({ cause })),\n )\n : spec;\n const withServer = isJsonObject(parsed)\n ? {\n ...parsed,\n servers: [{ url: baseUrl }],\n }\n : parsed;\n return yield* Effect.try({\n try: () => JSON.stringify(withServer),\n catch: (cause) => new OpenApiTestServerSpecError({ cause }),\n });\n });\n\nexport const makeOpenApiTestServer = (\n options: OpenApiTestServerOptions,\n): Effect.Effect<\n OpenApiTestServerShape,\n OpenApiTestServerAddressError | OpenApiTestServerSpecError,\n HttpClient.HttpClient | HttpServer.HttpServer\n> =>\n Effect.gen(function* () {\n const server = yield* HttpServer.HttpServer;\n const address = server.address;\n if (!Predicate.isTagged(address, \"TcpAddress\")) {\n return yield* new OpenApiTestServerAddressError({ address });\n }\n\n const client = yield* HttpClient.HttpClient;\n const baseUrl = `http://127.0.0.1:${address.port}`;\n const specJson = yield* openApiSpecJsonWithServer(options.spec, baseUrl);\n\n return {\n baseUrl,\n specJson,\n httpClientLayer: Layer.succeed(HttpClient.HttpClient, client),\n };\n });\n\nexport class OpenApiTestServer extends Context.Service<OpenApiTestServer, OpenApiTestServerShape>()(\n \"@executor-js/plugin-openapi/testing/OpenApiTestServer\",\n) {\n static readonly layer = (options: OpenApiTestServerOptions) =>\n Layer.effect(OpenApiTestServer, makeOpenApiTestServer(options));\n}\n\nexport const TestLayers = {\n server: OpenApiTestServer.layer,\n};\n"],"mappings":";AAAA,SAAS,SAAS,MAAM,QAAQ,OAAO,WAAW,cAAc;AAChE,SAAS,YAAY,kBAAkB;AAEhC,IAAM,gCAAN,cAA4C,KAAK;AAAA,EACtD;AACF,EAEG;AAAC;AAEG,IAAM,6BAAN,cAAyC,KAAK,YAAY,4BAA4B,EAE1F;AAAC;AAYJ,IAAM,iBAAiB,OAAO,oBAAoB,OAAO,eAAe,OAAO,OAAO,CAAC;AAEvF,IAAM,eAAe,CAAC,UACpB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAE9D,IAAM,4BAA4B,CACvC,MACA,YAEA,OAAO,IAAI,aAAa;AACtB,QAAM,SACJ,OAAO,SAAS,WACZ,OAAO,eAAe,IAAI,EAAE;AAAA,IAC1B,OAAO,SAAS,CAAC,UAAU,IAAI,2BAA2B,EAAE,MAAM,CAAC,CAAC;AAAA,EACtE,IACA;AACN,QAAM,aAAa,aAAa,MAAM,IAClC;AAAA,IACE,GAAG;AAAA,IACH,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC;AAAA,EAC5B,IACA;AACJ,SAAO,OAAO,OAAO,IAAI;AAAA,IACvB,KAAK,MAAM,KAAK,UAAU,UAAU;AAAA,IACpC,OAAO,CAAC,UAAU,IAAI,2BAA2B,EAAE,MAAM,CAAC;AAAA,EAC5D,CAAC;AACH,CAAC;AAEI,IAAM,wBAAwB,CACnC,YAMA,OAAO,IAAI,aAAa;AACtB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,UAAU,SAAS,SAAS,YAAY,GAAG;AAC9C,WAAO,OAAO,IAAI,8BAA8B,EAAE,QAAQ,CAAC;AAAA,EAC7D;AAEA,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAU,oBAAoB,QAAQ,IAAI;AAChD,QAAM,WAAW,OAAO,0BAA0B,QAAQ,MAAM,OAAO;AAEvE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,MAAM,QAAQ,WAAW,YAAY,MAAM;AAAA,EAC9D;AACF,CAAC;AAEI,IAAM,oBAAN,MAAM,2BAA0B,QAAQ,QAAmD;AAAA,EAChG;AACF,EAAE;AAAA,EACA,OAAgB,QAAQ,CAAC,YACvB,MAAM,OAAO,oBAAmB,sBAAsB,OAAO,CAAC;AAClE;AAEO,IAAM,aAAa;AAAA,EACxB,QAAQ,kBAAkB;AAC5B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/testing/index.ts"],"sourcesContent":["import { Context, Data, Effect, Layer, Option, Predicate, Ref, Schema, Scope } from \"effect\";\nimport {\n HttpClient,\n HttpRouter,\n HttpServerRequest,\n HttpServerResponse,\n} from \"effect/unstable/http\";\nimport {\n HttpApi,\n HttpApiBuilder,\n HttpApiEndpoint,\n HttpApiGroup,\n OpenApi,\n} from \"effect/unstable/httpapi\";\nimport { OAuthTestServer, serveTestHttpServerLayer } from \"@executor-js/sdk/testing\";\nimport { isToolResult } from \"@executor-js/sdk/core\";\nimport type { OpenApiPluginExtension, OpenApiSpecConfig } from \"../sdk/plugin\";\n\nexport class OpenApiTestServerAddressError extends Data.TaggedError(\n \"OpenApiTestServerAddressError\",\n)<{\n readonly address: unknown;\n}> {}\n\nexport class OpenApiTestServerSpecError extends Data.TaggedError(\"OpenApiTestServerSpecError\")<{\n readonly cause: unknown;\n}> {}\n\nexport interface OpenApiTestServerShape {\n readonly baseUrl: string;\n readonly specJson: string;\n readonly httpClientLayer: Layer.Layer<HttpClient.HttpClient, never, never>;\n}\n\nexport interface OpenApiHttpApiTestServerOptions {\n readonly api: HttpApi.Any;\n readonly handlersLayer: Layer.Layer<any, any, any>;\n readonly specPath?: `/${string}`;\n readonly transformSpec?: (spec: Record<string, unknown>) => Record<string, unknown>;\n readonly captureSpecRequest?: (\n request: HttpServerRequest.HttpServerRequest,\n ) => Effect.Effect<void>;\n readonly guardSpecRequest?: (\n request: HttpServerRequest.HttpServerRequest,\n ) => Effect.Effect<HttpServerResponse.HttpServerResponse | null>;\n}\n\nexport interface OpenApiHttpApiTestServerShape extends OpenApiTestServerShape {\n readonly specUrl: string;\n}\n\nexport interface MutableOpenApiSpecTestServerShape extends OpenApiTestServerShape {\n readonly specUrl: string;\n readonly setApi: (api: HttpApi.Any) => Effect.Effect<void, OpenApiTestServerSpecError>;\n readonly requestCount: Effect.Effect<number>;\n}\n\nexport interface OpenApiTestRequest {\n readonly method: string;\n readonly url: string;\n readonly path: string;\n readonly headers: Readonly<Record<string, string>>;\n readonly body: string;\n}\n\nexport interface OpenApiEchoTestServerOptions {\n readonly transformSpec?: (spec: Record<string, unknown>) => Record<string, unknown>;\n readonly oauth2?: {\n readonly authorizationUrl: string;\n readonly tokenUrl: string;\n readonly scopes?: Readonly<Record<string, string>>;\n readonly validateAuthorization?: (authorization: string | null) => Effect.Effect<boolean>;\n readonly wwwAuthenticate?: string;\n };\n}\n\nexport interface OpenApiEchoTestServerShape extends OpenApiTestServerShape {\n readonly specUrl: string;\n readonly requests: Effect.Effect<readonly OpenApiTestRequest[]>;\n readonly clearRequests: Effect.Effect<void>;\n}\n\nexport type OpenApiTestSourceOptions = Omit<\n OpenApiSpecConfig,\n \"spec\" | \"baseUrl\" | \"name\" | \"namespace\"\n> & {\n readonly baseUrl?: string | null;\n readonly name?: string;\n readonly namespace?: string;\n};\n\nexport type OpenApiHttpApiTestSourceOptions = Omit<\n OpenApiSpecConfig,\n \"spec\" | \"name\" | \"namespace\" | \"baseUrl\"\n> & {\n readonly name?: string;\n readonly namespace?: string;\n readonly baseUrl?: string | null;\n readonly specBaseUrl?: string;\n readonly transformSpec?: (spec: Record<string, unknown>) => Record<string, unknown>;\n};\n\ntype OpenApiHttpApiAddSpecCredentialInput =\n | string\n | {\n readonly kind: \"secret\";\n readonly prefix?: string;\n };\n\ntype OpenApiHttpApiAddSpecCredentialsInput = {\n readonly headers?: Record<string, OpenApiHttpApiAddSpecCredentialInput>;\n readonly queryParams?: Record<string, OpenApiHttpApiAddSpecCredentialInput>;\n};\n\nexport type OpenApiHttpApiTestAddSpecPayloadOptions = Omit<\n OpenApiHttpApiTestSourceOptions,\n \"scope\" | \"headers\" | \"queryParams\" | \"specFetchCredentials\"\n> &\n OpenApiHttpApiAddSpecCredentialsInput & {\n readonly specFetchCredentials?: OpenApiHttpApiAddSpecCredentialsInput;\n };\n\nexport type OpenApiTestSourceExecutor = {\n readonly openapi: Pick<OpenApiPluginExtension, \"addSpec\">;\n};\n\nexport interface OpenApiTestSpecOptions {\n readonly baseUrl?: string;\n readonly transformSpec?: (spec: Record<string, unknown>) => Record<string, unknown>;\n}\n\nexport const makeOpenApiTestSpecJson = (\n api: HttpApi.Any,\n options: OpenApiTestSpecOptions = {},\n): string => {\n const annotations = OpenApi.annotations({\n ...(options.baseUrl !== undefined ? { servers: [{ url: options.baseUrl }] } : {}),\n transform: options.transformSpec,\n });\n const annotated = (api as HttpApi.AnyWithProps).annotateMerge(annotations);\n return JSON.stringify(OpenApi.fromApi(annotated));\n};\n\nexport const makeOpenApiTestSourceConfig = (\n server: OpenApiTestServerShape,\n options: OpenApiTestSourceOptions,\n): OpenApiSpecConfig => {\n const { baseUrl, ...rest } = options;\n return {\n ...rest,\n spec: { kind: \"blob\", value: server.specJson },\n name: rest.name ?? \"Test API\",\n namespace: rest.namespace ?? \"test_api\",\n ...(baseUrl === null ? {} : { baseUrl: baseUrl ?? server.baseUrl }),\n } as OpenApiSpecConfig;\n};\n\nexport const addOpenApiTestSource = (\n executor: OpenApiTestSourceExecutor,\n server: OpenApiTestServerShape,\n options: OpenApiTestSourceOptions,\n) => executor.openapi.addSpec(makeOpenApiTestSourceConfig(server, options));\n\nexport const makeOpenApiHttpApiTestSourceConfig = (\n api: HttpApi.Any,\n options: OpenApiHttpApiTestSourceOptions,\n): OpenApiSpecConfig => {\n const { baseUrl, specBaseUrl, transformSpec, ...config } = options;\n return {\n ...config,\n spec: {\n kind: \"blob\",\n value: makeOpenApiTestSpecJson(api, { baseUrl: specBaseUrl, transformSpec }),\n },\n name: config.name ?? \"Test API\",\n namespace: config.namespace ?? \"test_api\",\n ...(baseUrl === null ? {} : { baseUrl: baseUrl ?? specBaseUrl ?? \"https://api.example.test\" }),\n } as OpenApiSpecConfig;\n};\n\nexport const addOpenApiHttpApiTestSource = (\n executor: OpenApiTestSourceExecutor,\n api: HttpApi.Any,\n options: OpenApiHttpApiTestSourceOptions,\n) => executor.openapi.addSpec(makeOpenApiHttpApiTestSourceConfig(api, options));\n\nexport const makeOpenApiHttpApiTestAddSpecPayload = (\n api: HttpApi.Any,\n options: OpenApiHttpApiTestAddSpecPayloadOptions,\n) => {\n const { ...sourceOptions } = options;\n const config = makeOpenApiHttpApiTestSourceConfig(api, {\n ...sourceOptions,\n scope: \"unused-http-helper-scope\",\n });\n return {\n spec: config.spec,\n namespace: config.namespace,\n name: config.name,\n baseUrl: config.baseUrl,\n ...(sourceOptions.headers !== undefined ? { headers: sourceOptions.headers } : {}),\n ...(sourceOptions.queryParams !== undefined ? { queryParams: sourceOptions.queryParams } : {}),\n ...(config.oauth2 !== undefined ? { oauth2: config.oauth2 } : {}),\n ...(sourceOptions.specFetchCredentials !== undefined\n ? { specFetchCredentials: sourceOptions.specFetchCredentials }\n : {}),\n };\n};\n\nexport const makeOpenApiHttpApiTestSpecPayload = (\n api: HttpApi.Any,\n options: OpenApiTestSpecOptions = {},\n) => ({\n spec: makeOpenApiTestSpecJson(api, options),\n});\n\nconst isJsonObject = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst OpenApiEchoItem = Schema.Struct({\n id: Schema.Number,\n name: Schema.String,\n});\n\nconst OpenApiEchoHeaders = Schema.Struct({\n authorization: Schema.optional(Schema.String),\n \"x-static\": Schema.optional(Schema.String),\n});\n\nconst OpenApiEchoMessage = Schema.Struct({\n message: Schema.String,\n suffix: Schema.optional(Schema.String),\n path: Schema.String,\n});\n\nconst OpenApiEchoItemsGroup = HttpApiGroup.make(\"items\")\n .add(\n HttpApiEndpoint.get(\"listItems\", \"/items\", {\n success: Schema.Array(OpenApiEchoItem),\n }),\n )\n .add(\n HttpApiEndpoint.get(\"echoHeaders\", \"/echo-headers\", {\n success: OpenApiEchoHeaders,\n }),\n );\n\nconst OpenApiEchoGroup = HttpApiGroup.make(\"echo\").add(\n HttpApiEndpoint.get(\"echoMessage\", \"/echo/:message\", {\n params: Schema.Struct({ message: Schema.String }),\n query: Schema.Struct({ suffix: Schema.optional(Schema.String) }),\n success: OpenApiEchoMessage,\n }),\n);\n\nconst OpenApiEchoApi = HttpApi.make(\"executorOpenApiTest\")\n .add(OpenApiEchoItemsGroup)\n .add(OpenApiEchoGroup)\n .annotateMerge(\n OpenApi.annotations({\n title: \"Executor OpenAPI Test Server\",\n version: \"1.0.0\",\n }),\n );\n\nconst openApiSpecJsonFromHttpApi = (\n api: HttpApi.Any,\n baseUrl: string,\n transformSpec?: (spec: Record<string, unknown>) => Record<string, unknown>,\n): Effect.Effect<string, OpenApiTestServerSpecError> =>\n Effect.try({\n try: () => makeOpenApiTestSpecJson(api, { baseUrl, transformSpec }),\n catch: (cause) => new OpenApiTestServerSpecError({ cause }),\n });\n\nexport const serveOpenApiHttpApiTestServer = (\n options: OpenApiHttpApiTestServerOptions,\n): Effect.Effect<\n OpenApiHttpApiTestServerShape,\n OpenApiTestServerAddressError | OpenApiTestServerSpecError,\n Scope.Scope\n> =>\n Effect.gen(function* () {\n const specPath = options.specPath ?? \"/spec.json\";\n let specJson = \"\";\n const SpecRoute = HttpRouter.addAll([\n HttpRouter.route(\n \"GET\",\n specPath,\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n if (options.captureSpecRequest) {\n yield* options.captureSpecRequest(request);\n }\n const guardResponse = options.guardSpecRequest\n ? yield* options.guardSpecRequest(request)\n : null;\n if (guardResponse) return guardResponse;\n return HttpServerResponse.text(specJson, {\n status: 200,\n contentType: \"application/json\",\n });\n }),\n ),\n ]);\n const ApiLive = HttpApiBuilder.layer(options.api as HttpApi.AnyWithProps).pipe(\n Layer.provide(options.handlersLayer),\n );\n const ServerLayer = HttpRouter.serve(Layer.mergeAll(ApiLive, SpecRoute), {\n disableListenLog: true,\n disableLogger: true,\n });\n const server = yield* serveTestHttpServerLayer(ServerLayer).pipe(\n Effect.mapError((error) =>\n Predicate.isTagged(error, \"TestHttpServerAddressError\")\n ? new OpenApiTestServerAddressError({ address: error.address })\n : new OpenApiTestServerSpecError({ cause: error.cause }),\n ),\n );\n specJson = yield* openApiSpecJsonFromHttpApi(\n options.api,\n server.baseUrl,\n options.transformSpec,\n );\n\n return {\n baseUrl: server.baseUrl,\n specUrl: server.url(specPath),\n specJson,\n httpClientLayer: server.httpClientLayer,\n };\n });\n\nexport class OpenApiHttpApiTestServer extends Context.Service<\n OpenApiHttpApiTestServer,\n OpenApiHttpApiTestServerShape\n>()(\"@executor-js/plugin-openapi/testing/OpenApiHttpApiTestServer\") {\n static readonly layer = (options: OpenApiHttpApiTestServerOptions) =>\n Layer.effect(OpenApiHttpApiTestServer, serveOpenApiHttpApiTestServer(options));\n}\n\nexport const serveMutableOpenApiSpecTestServer = (options: {\n readonly initialApi: HttpApi.Any;\n readonly specPath?: `/${string}`;\n readonly transformSpec?: (spec: Record<string, unknown>) => Record<string, unknown>;\n}): Effect.Effect<\n MutableOpenApiSpecTestServerShape,\n OpenApiTestServerAddressError | OpenApiTestServerSpecError,\n Scope.Scope\n> =>\n Effect.gen(function* () {\n const specPath = options.specPath ?? \"/spec.json\";\n const specJson = yield* Ref.make(\"\");\n const requests = yield* Ref.make(0);\n const SpecRoute = HttpRouter.addAll([\n HttpRouter.route(\n \"GET\",\n specPath,\n Effect.gen(function* () {\n yield* Ref.update(requests, (count) => count + 1);\n const current = yield* Ref.get(specJson);\n return HttpServerResponse.text(current, {\n status: 200,\n contentType: \"application/json\",\n });\n }),\n ),\n ]);\n const server = yield* serveTestHttpServerLayer(\n HttpRouter.serve(SpecRoute, {\n disableListenLog: true,\n disableLogger: true,\n }),\n ).pipe(\n Effect.mapError((error) =>\n Predicate.isTagged(error, \"TestHttpServerAddressError\")\n ? new OpenApiTestServerAddressError({ address: error.address })\n : new OpenApiTestServerSpecError({ cause: error.cause }),\n ),\n );\n const renderSpec = (api: HttpApi.Any) =>\n openApiSpecJsonFromHttpApi(api, server.baseUrl, options.transformSpec);\n yield* Ref.set(specJson, yield* renderSpec(options.initialApi));\n\n return {\n baseUrl: server.baseUrl,\n specUrl: server.url(specPath),\n specJson: yield* Ref.get(specJson),\n httpClientLayer: server.httpClientLayer,\n setApi: (api) => renderSpec(api).pipe(Effect.flatMap((next) => Ref.set(specJson, next))),\n requestCount: Ref.get(requests),\n };\n });\n\nconst openApiOperationMethods = new Set([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n]);\n\nconst withOAuth2Security =\n (oauth2: NonNullable<OpenApiEchoTestServerOptions[\"oauth2\"]>) =>\n (spec: Record<string, unknown>): Record<string, unknown> => {\n const scopes = oauth2.scopes ?? { read: \"Read test resources\" };\n const security = [{ oauth2: Object.keys(scopes) }];\n const paths = isJsonObject(spec.paths)\n ? Object.fromEntries(\n Object.entries(spec.paths).map(([path, pathItem]) => [\n path,\n isJsonObject(pathItem)\n ? Object.fromEntries(\n Object.entries(pathItem).map(([method, operation]) => [\n method,\n openApiOperationMethods.has(method) && isJsonObject(operation)\n ? { ...operation, security }\n : operation,\n ]),\n )\n : pathItem,\n ]),\n )\n : spec.paths;\n const components = isJsonObject(spec.components) ? spec.components : {};\n const securitySchemes = isJsonObject(components.securitySchemes)\n ? components.securitySchemes\n : {};\n\n return {\n ...spec,\n paths,\n components: {\n ...components,\n securitySchemes: {\n ...securitySchemes,\n oauth2: {\n type: \"oauth2\",\n flows: {\n authorizationCode: {\n authorizationUrl: oauth2.authorizationUrl,\n tokenUrl: oauth2.tokenUrl,\n scopes,\n },\n },\n },\n },\n },\n };\n };\n\nconst composeSpecTransforms =\n (\n ...transforms: readonly (\n | ((spec: Record<string, unknown>) => Record<string, unknown>)\n | undefined\n )[]\n ) =>\n (spec: Record<string, unknown>): Record<string, unknown> =>\n transforms.reduce((current, transform) => (transform ? transform(current) : current), spec);\n\nconst recordOpenApiRequest = (\n requests: Ref.Ref<readonly OpenApiTestRequest[]>,\n request: HttpServerRequest.HttpServerRequest,\n) =>\n Effect.gen(function* () {\n const url = new URL(request.url, \"http://executor.test\");\n const body = yield* request.text.pipe(Effect.catch(() => Effect.succeed(\"\")));\n yield* Ref.update(requests, (all) => [\n ...all,\n {\n method: request.method,\n url: request.url,\n path: url.pathname,\n headers: request.headers,\n body,\n },\n ]);\n return request;\n });\n\nconst captureOpenApiRequest = (requests: Ref.Ref<readonly OpenApiTestRequest[]>) =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n return yield* recordOpenApiRequest(requests, request);\n });\n\nconst openApiUnauthorizedResponse = (\n options: OpenApiEchoTestServerOptions,\n authorization: string | null,\n): Effect.Effect<HttpServerResponse.HttpServerResponse | null> =>\n options.oauth2?.validateAuthorization\n ? options.oauth2.validateAuthorization(authorization).pipe(\n Effect.map((accepted) =>\n accepted\n ? null\n : HttpServerResponse.jsonUnsafe(\n { error: \"invalid_token\" },\n options.oauth2?.wwwAuthenticate\n ? {\n status: 401,\n headers: {\n \"www-authenticate\": options.oauth2.wwwAuthenticate,\n },\n }\n : { status: 401 },\n ),\n ),\n )\n : Effect.succeed(null);\n\nconst makeOpenApiEchoItemsGroupLive = (\n requests: Ref.Ref<readonly OpenApiTestRequest[]>,\n options: OpenApiEchoTestServerOptions,\n) =>\n HttpApiBuilder.group(OpenApiEchoApi, \"items\", (handlers) =>\n handlers\n .handle(\"listItems\", () =>\n Effect.gen(function* () {\n const request = yield* captureOpenApiRequest(requests);\n const unauthorized = yield* openApiUnauthorizedResponse(\n options,\n request.headers.authorization ?? null,\n );\n if (unauthorized) return unauthorized;\n return [\n OpenApiEchoItem.make({ id: 1, name: \"Widget\" }),\n OpenApiEchoItem.make({ id: 2, name: \"Gadget\" }),\n ];\n }),\n )\n .handle(\"echoHeaders\", () =>\n Effect.gen(function* () {\n const request = yield* captureOpenApiRequest(requests);\n const unauthorized = yield* openApiUnauthorizedResponse(\n options,\n request.headers.authorization ?? null,\n );\n if (unauthorized) return unauthorized;\n return OpenApiEchoHeaders.make({\n authorization: request.headers.authorization,\n \"x-static\": request.headers[\"x-static\"],\n });\n }),\n ),\n );\n\nconst makeOpenApiEchoGroupLive = (\n requests: Ref.Ref<readonly OpenApiTestRequest[]>,\n options: OpenApiEchoTestServerOptions,\n) =>\n HttpApiBuilder.group(OpenApiEchoApi, \"echo\", (handlers) =>\n handlers.handle(\"echoMessage\", ({ params, query }) =>\n Effect.gen(function* () {\n const request = yield* captureOpenApiRequest(requests);\n const unauthorized = yield* openApiUnauthorizedResponse(\n options,\n request.headers.authorization ?? null,\n );\n if (unauthorized) return unauthorized;\n const path = `/echo/${encodeURIComponent(params.message)}`;\n return OpenApiEchoMessage.make({\n message: params.message,\n ...(query.suffix ? { suffix: query.suffix } : {}),\n path,\n });\n }),\n ),\n );\n\nexport const serveOpenApiEchoTestServer = (\n options: OpenApiEchoTestServerOptions = {},\n): Effect.Effect<\n OpenApiEchoTestServerShape,\n OpenApiTestServerAddressError | OpenApiTestServerSpecError,\n Scope.Scope\n> =>\n Effect.gen(function* () {\n const requests = yield* Ref.make<readonly OpenApiTestRequest[]>([]);\n let specJson = \"\";\n const server = yield* serveOpenApiHttpApiTestServer({\n api: OpenApiEchoApi,\n handlersLayer: Layer.mergeAll(\n makeOpenApiEchoItemsGroupLive(requests, options),\n makeOpenApiEchoGroupLive(requests, options),\n ),\n transformSpec: composeSpecTransforms(\n options.oauth2 ? withOAuth2Security(options.oauth2) : undefined,\n options.transformSpec,\n ),\n captureSpecRequest: (request) => recordOpenApiRequest(requests, request).pipe(Effect.asVoid),\n });\n specJson = server.specJson;\n\n return {\n baseUrl: server.baseUrl,\n specUrl: server.specUrl,\n specJson,\n httpClientLayer: server.httpClientLayer,\n requests: Ref.get(requests),\n clearRequests: Ref.set(requests, []),\n };\n });\n\nexport const serveOpenApiEchoTestServerWithOAuth = (\n options: Omit<OpenApiEchoTestServerOptions, \"oauth2\"> & {\n readonly scopes?: Readonly<Record<string, string>>;\n readonly wwwAuthenticate?: string;\n } = {},\n) =>\n Effect.gen(function* () {\n const oauth = yield* OAuthTestServer;\n return yield* serveOpenApiEchoTestServer({\n transformSpec: options.transformSpec,\n oauth2: {\n authorizationUrl: oauth.authorizationEndpoint,\n tokenUrl: oauth.tokenEndpoint,\n scopes: options.scopes,\n validateAuthorization: oauth.acceptsAuthorizationHeader,\n wwwAuthenticate: options.wwwAuthenticate,\n },\n });\n });\n\nexport class OpenApiEchoTestServer extends Context.Service<\n OpenApiEchoTestServer,\n OpenApiEchoTestServerShape\n>()(\"@executor-js/plugin-openapi/testing/OpenApiEchoTestServer\") {\n static readonly layer = (options?: OpenApiEchoTestServerOptions) =>\n Layer.effect(OpenApiEchoTestServer, serveOpenApiEchoTestServer(options));\n\n static readonly layerWithOAuth = (\n options?: Omit<OpenApiEchoTestServerOptions, \"oauth2\"> & {\n readonly scopes?: Readonly<Record<string, string>>;\n readonly wwwAuthenticate?: string;\n },\n ) => Layer.effect(OpenApiEchoTestServer, serveOpenApiEchoTestServerWithOAuth(options));\n}\n\nexport const TestLayers = {\n httpApi: OpenApiHttpApiTestServer.layer,\n echo: OpenApiEchoTestServer.layer,\n echoWithOAuth: OpenApiEchoTestServer.layerWithOAuth,\n};\n\nconst OpenApiTransportEnvelope = Schema.Struct({\n status: Schema.Number,\n headers: Schema.Record(Schema.String, Schema.String),\n data: Schema.Unknown,\n});\n\nconst decodeOpenApiTransportEnvelope = Schema.decodeUnknownOption(OpenApiTransportEnvelope);\n\nexport interface OpenApiInvocationResult<TData = Record<string, unknown> | unknown[] | null> {\n readonly status: number | null;\n readonly headers: Record<string, string> | null;\n readonly data: TData;\n readonly error: unknown;\n}\n\nexport const unwrapInvocation = <TData = Record<string, unknown> | null>(\n raw: unknown,\n): OpenApiInvocationResult<TData> => {\n if (!isToolResult(raw)) {\n return {\n status: null,\n headers: null,\n data: raw as TData,\n error: null,\n };\n }\n if (raw.ok) {\n const inner = raw.data;\n const wrapped = Option.getOrUndefined(decodeOpenApiTransportEnvelope(inner));\n if (wrapped !== undefined) {\n return {\n status: wrapped.status,\n headers: wrapped.headers,\n data: wrapped.data as TData,\n error: null,\n };\n }\n return {\n status: null,\n headers: null,\n data: inner as TData,\n error: null,\n };\n }\n return {\n status: raw.error.status ?? null,\n headers: null,\n data: null as TData,\n error: raw.error.details ?? raw.error,\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@executor-js/plugin-openapi",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.30",
|
|
4
4
|
"homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/plugins/openapi",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/RhysSullivan/executor/issues"
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@effect/platform-node": "4.0.0-beta.59",
|
|
56
|
-
"@executor-js/config": "1.4.
|
|
57
|
-
"@executor-js/sdk": "1.4.
|
|
56
|
+
"@executor-js/config": "1.4.30",
|
|
57
|
+
"@executor-js/sdk": "1.4.30",
|
|
58
58
|
"effect": "4.0.0-beta.59",
|
|
59
59
|
"openapi-types": "^12.1.3",
|
|
60
60
|
"yaml": "^2.7.1"
|
|
@@ -62,7 +62,6 @@
|
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@effect/atom-react": "4.0.0-beta.59",
|
|
64
64
|
"@effect/vitest": "4.0.0-beta.59",
|
|
65
|
-
"@executor-js/storage-core": "1.4.29",
|
|
66
65
|
"@types/node": "^24.3.1",
|
|
67
66
|
"@types/react": "^19.1.0",
|
|
68
67
|
"bun-types": "^1.2.22",
|