@executor-js/plugin-openapi 1.4.29 → 1.4.31

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.
Files changed (45) hide show
  1. package/dist/{AddOpenApiSource-FLMNI742.js → AddOpenApiSource-KSOMPQ2R.js} +4 -4
  2. package/dist/{EditOpenApiSource-I4NIGIIJ.js → EditOpenApiSource-AOA7APR2.js} +301 -192
  3. package/dist/EditOpenApiSource-AOA7APR2.js.map +1 -0
  4. package/dist/{OpenApiSourceSummary-CM46DB4L.js → OpenApiSourceSummary-Y3S6ZBOZ.js} +4 -4
  5. package/dist/OpenApiSourceSummary-Y3S6ZBOZ.js.map +1 -0
  6. package/dist/api/group.d.ts +124 -118
  7. package/dist/api/index.d.ts +148 -369
  8. package/dist/chunk-BB5IAKRG.js +136 -0
  9. package/dist/chunk-BB5IAKRG.js.map +1 -0
  10. package/dist/{chunk-E7PZ2QGD.js → chunk-EOXXE5DG.js} +17 -455
  11. package/dist/chunk-EOXXE5DG.js.map +1 -0
  12. package/dist/{chunk-OZ67JNID.js → chunk-NIKLYJ3X.js} +830 -319
  13. package/dist/chunk-NIKLYJ3X.js.map +1 -0
  14. package/dist/{chunk-TGDT6QCH.js → chunk-YJMXYKYX.js} +178 -117
  15. package/dist/chunk-YJMXYKYX.js.map +1 -0
  16. package/dist/{chunk-GFQUEZUW.js → chunk-ZZBTLFTA.js} +78 -93
  17. package/dist/chunk-ZZBTLFTA.js.map +1 -0
  18. package/dist/client.js +7 -137
  19. package/dist/client.js.map +1 -1
  20. package/dist/core.js +5 -10
  21. package/dist/index.js +3 -2
  22. package/dist/react/atoms.d.ts +83 -223
  23. package/dist/react/client.d.ts +123 -117
  24. package/dist/sdk/credential-status.d.ts +3 -3
  25. package/dist/sdk/extract.d.ts +19 -19
  26. package/dist/sdk/index.d.ts +2 -2
  27. package/dist/sdk/invoke.d.ts +7 -7
  28. package/dist/sdk/parse.d.ts +2 -3
  29. package/dist/sdk/plugin.d.ts +181 -275
  30. package/dist/sdk/preview.d.ts +12 -12
  31. package/dist/sdk/source-contracts.d.ts +55 -0
  32. package/dist/sdk/store.d.ts +6 -269
  33. package/dist/sdk/types.d.ts +16 -65
  34. package/dist/testing/index.d.ts +149 -11
  35. package/dist/testing.js +419 -33
  36. package/dist/testing.js.map +1 -1
  37. package/dist/testing.test.d.ts +1 -0
  38. package/package.json +3 -4
  39. package/dist/EditOpenApiSource-I4NIGIIJ.js.map +0 -1
  40. package/dist/OpenApiSourceSummary-CM46DB4L.js.map +0 -1
  41. package/dist/chunk-E7PZ2QGD.js.map +0 -1
  42. package/dist/chunk-GFQUEZUW.js.map +0 -1
  43. package/dist/chunk-OZ67JNID.js.map +0 -1
  44. package/dist/chunk-TGDT6QCH.js.map +0 -1
  45. /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 { HttpClient, HttpServer } from "effect/unstable/http";
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 decodeJsonSpec = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
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 openApiSpecJsonWithServer = (spec, baseUrl) => Effect.gen(function* () {
13
- const parsed = typeof spec === "string" ? yield* decodeJsonSpec(spec).pipe(
14
- Effect.mapError((cause) => new OpenApiTestServerSpecError({ cause }))
15
- ) : spec;
16
- const withServer = isJsonObject(parsed) ? {
17
- ...parsed,
18
- servers: [{ url: baseUrl }]
19
- } : parsed;
20
- return yield* Effect.try({
21
- try: () => JSON.stringify(withServer),
22
- catch: (cause) => new OpenApiTestServerSpecError({ cause })
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 makeOpenApiTestServer = (options) => Effect.gen(function* () {
26
- const server = yield* HttpServer.HttpServer;
27
- const address = server.address;
28
- if (!Predicate.isTagged(address, "TcpAddress")) {
29
- return yield* new OpenApiTestServerAddressError({ address });
30
- }
31
- const client = yield* HttpClient.HttpClient;
32
- const baseUrl = `http://127.0.0.1:${address.port}`;
33
- const specJson = yield* openApiSpecJsonWithServer(options.spec, baseUrl);
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: Layer.succeed(HttpClient.HttpClient, client)
356
+ httpClientLayer: server.httpClientLayer,
357
+ requests: Ref.get(requests),
358
+ clearRequests: Ref.set(requests, [])
38
359
  };
39
360
  });
40
- var OpenApiTestServer = class _OpenApiTestServer extends Context.Service()(
41
- "@executor-js/plugin-openapi/testing/OpenApiTestServer"
42
- ) {
43
- static layer = (options) => Layer.effect(_OpenApiTestServer, makeOpenApiTestServer(options));
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
- server: OpenApiTestServer.layer
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
- OpenApiTestServer,
424
+ OpenApiEchoTestServer,
425
+ OpenApiHttpApiTestServer,
50
426
  OpenApiTestServerAddressError,
51
427
  OpenApiTestServerSpecError,
52
428
  TestLayers,
53
- makeOpenApiTestServer,
54
- openApiSpecJsonWithServer
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
@@ -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.29",
3
+ "version": "1.4.31",
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.29",
57
- "@executor-js/sdk": "1.4.29",
56
+ "@executor-js/config": "1.4.31",
57
+ "@executor-js/sdk": "1.4.31",
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",