@executor-js/plugin-openapi 1.5.22 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AddOpenApiSource-26V6EZD4.js → AddOpenApiSource-6PJZWRRZ.js} +17 -12
- package/dist/AddOpenApiSource-6PJZWRRZ.js.map +1 -0
- package/dist/{OpenApiAccountsPanel-XNDADPBL.js → OpenApiAccountsPanel-W6IMUY7Q.js} +4 -4
- package/dist/{UpdateSpecSection-MWC5DBXF.js → UpdateSpecSection-R2RF2QV2.js} +3 -3
- package/dist/api/group.d.ts +10 -0
- package/dist/api/index.d.ts +12 -0
- package/dist/{chunk-UYPLGACO.js → chunk-562TAVB2.js} +5 -3
- package/dist/chunk-562TAVB2.js.map +1 -0
- package/dist/{chunk-RCBR3QMJ.js → chunk-56PVOO6X.js} +10 -4
- package/dist/{chunk-RCBR3QMJ.js.map → chunk-56PVOO6X.js.map} +1 -1
- package/dist/{chunk-5YG34JIY.js → chunk-DBA2BHE4.js} +194 -18
- package/dist/chunk-DBA2BHE4.js.map +1 -0
- package/dist/{chunk-QQFCICLX.js → chunk-HG5JB2UJ.js} +9 -1
- package/dist/{chunk-QQFCICLX.js.map → chunk-HG5JB2UJ.js.map} +1 -1
- package/dist/{chunk-W6DGFLYT.js → chunk-IVRAOG3T.js} +5 -3
- package/dist/{chunk-W6DGFLYT.js.map → chunk-IVRAOG3T.js.map} +1 -1
- package/dist/{chunk-XFJWX2CY.js → chunk-WWZ7B34D.js} +8 -2
- package/dist/{chunk-XFJWX2CY.js.map → chunk-WWZ7B34D.js.map} +1 -1
- package/dist/client.js +4 -4
- package/dist/core.js +4 -4
- package/dist/index.js +4 -4
- package/dist/react/AddOpenApiSource.d.ts +1 -0
- package/dist/react/AddOpenApiSource.test.d.ts +1 -0
- package/dist/react/atoms.d.ts +12 -0
- package/dist/react/client.d.ts +10 -0
- package/dist/sdk/config.d.ts +4 -0
- package/dist/sdk/plugin.d.ts +2 -0
- package/dist/sdk/preview.d.ts +16 -0
- package/package.json +3 -3
- package/dist/AddOpenApiSource-26V6EZD4.js.map +0 -1
- package/dist/chunk-5YG34JIY.js.map +0 -1
- package/dist/chunk-UYPLGACO.js.map +0 -1
- /package/dist/{OpenApiAccountsPanel-XNDADPBL.js.map → OpenApiAccountsPanel-W6IMUY7Q.js.map} +0 -0
- /package/dist/{UpdateSpecSection-MWC5DBXF.js.map → UpdateSpecSection-R2RF2QV2.js.map} +0 -0
package/dist/client.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
openApiPresets
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HG5JB2UJ.js";
|
|
4
4
|
|
|
5
5
|
// src/react/plugin-client.tsx
|
|
6
6
|
import { defineClientPlugin } from "@executor-js/sdk/client";
|
|
7
7
|
|
|
8
8
|
// src/react/source-plugin.ts
|
|
9
9
|
import { lazy } from "react";
|
|
10
|
-
var importAdd = () => import("./AddOpenApiSource-
|
|
11
|
-
var importEditSheet = () => import("./UpdateSpecSection-
|
|
12
|
-
var importAccounts = () => import("./OpenApiAccountsPanel-
|
|
10
|
+
var importAdd = () => import("./AddOpenApiSource-6PJZWRRZ.js");
|
|
11
|
+
var importEditSheet = () => import("./UpdateSpecSection-R2RF2QV2.js");
|
|
12
|
+
var importAccounts = () => import("./OpenApiAccountsPanel-W6IMUY7Q.js");
|
|
13
13
|
var openApiIntegrationPlugin = {
|
|
14
14
|
key: "openapi",
|
|
15
15
|
label: "OpenAPI",
|
package/dist/core.js
CHANGED
|
@@ -22,9 +22,9 @@ import {
|
|
|
22
22
|
renderAuthTemplate,
|
|
23
23
|
resolveOpenApiBackedAnnotations,
|
|
24
24
|
resolveOpenApiBackedTools
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-DBA2BHE4.js";
|
|
26
|
+
import "./chunk-IVRAOG3T.js";
|
|
27
|
+
import "./chunk-HG5JB2UJ.js";
|
|
28
28
|
import {
|
|
29
29
|
AuthStrategy,
|
|
30
30
|
DocResolver,
|
|
@@ -72,7 +72,7 @@ import {
|
|
|
72
72
|
streamOperationBindingsFromStructure,
|
|
73
73
|
structuralSplit,
|
|
74
74
|
substituteUrlVariables
|
|
75
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-WWZ7B34D.js";
|
|
76
76
|
|
|
77
77
|
// src/sdk/index.ts
|
|
78
78
|
import { variable } from "@executor-js/sdk/http-auth";
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
openApiPlugin
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-DBA2BHE4.js";
|
|
4
|
+
import "./chunk-IVRAOG3T.js";
|
|
5
|
+
import "./chunk-HG5JB2UJ.js";
|
|
6
6
|
import {
|
|
7
7
|
TOKEN_VARIABLE
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WWZ7B34D.js";
|
|
9
9
|
|
|
10
10
|
// src/promise.ts
|
|
11
11
|
import { variable } from "@executor-js/sdk/http-auth";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/react/atoms.d.ts
CHANGED
|
@@ -33,6 +33,8 @@ export declare const openApiConfigAtom: (slug: IntegrationSlug) => Atom.Atom<imp
|
|
|
33
33
|
readonly authorizationUrl: string;
|
|
34
34
|
readonly tokenUrl: string;
|
|
35
35
|
readonly scopes: readonly string[];
|
|
36
|
+
readonly resource?: string | null | undefined;
|
|
37
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
36
38
|
})[] | undefined;
|
|
37
39
|
} | null, import("@executor-js/sdk").IntegrationAlreadyExistsError | import("@executor-js/sdk").InternalError | import("../sdk").OpenApiParseError | import("../sdk").OpenApiExtractionError | import("../sdk").OpenApiOAuthError>>;
|
|
38
40
|
export declare const previewOpenApiSpec: Atom.AtomResultFn<{
|
|
@@ -95,6 +97,7 @@ export declare const previewOpenApiSpec: Atom.AtomResultFn<{
|
|
|
95
97
|
readonly secretHeaders: readonly string[];
|
|
96
98
|
}[];
|
|
97
99
|
readonly oauth2Presets: readonly {
|
|
100
|
+
readonly resource: import("effect/Option").Option<string>;
|
|
98
101
|
readonly label: string;
|
|
99
102
|
readonly authorizationUrl: import("effect/Option").Option<string>;
|
|
100
103
|
readonly tokenUrl: string;
|
|
@@ -105,6 +108,7 @@ export declare const previewOpenApiSpec: Atom.AtomResultFn<{
|
|
|
105
108
|
readonly flow: "authorizationCode" | "clientCredentials";
|
|
106
109
|
readonly identityScopes: false | "auto" | readonly string[];
|
|
107
110
|
readonly securitySchemeName: string;
|
|
111
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
108
112
|
}[];
|
|
109
113
|
readonly operationCount: number;
|
|
110
114
|
}, import("@executor-js/sdk").IntegrationAlreadyExistsError | import("@executor-js/sdk").InternalError | import("../sdk").OpenApiParseError | import("../sdk").OpenApiExtractionError | import("../sdk").OpenApiOAuthError>;
|
|
@@ -149,6 +153,8 @@ export declare const addOpenApiSpec: Atom.AtomResultFn<{
|
|
|
149
153
|
readonly authorizationUrl: string;
|
|
150
154
|
readonly tokenUrl: string;
|
|
151
155
|
readonly scopes: readonly string[];
|
|
156
|
+
readonly resource?: string | null | undefined;
|
|
157
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
152
158
|
})[] | undefined;
|
|
153
159
|
};
|
|
154
160
|
readonly responseMode?: "decoded-only" | undefined;
|
|
@@ -215,6 +221,8 @@ export declare const openapiConfigure: Atom.AtomResultFn<{
|
|
|
215
221
|
readonly authorizationUrl: string;
|
|
216
222
|
readonly tokenUrl: string;
|
|
217
223
|
readonly scopes: readonly string[];
|
|
224
|
+
readonly resource?: string | null | undefined;
|
|
225
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
218
226
|
})[];
|
|
219
227
|
readonly mode?: "replace" | "merge" | undefined;
|
|
220
228
|
};
|
|
@@ -238,6 +246,8 @@ export declare const openapiConfigure: Atom.AtomResultFn<{
|
|
|
238
246
|
readonly authorizationUrl: string;
|
|
239
247
|
readonly tokenUrl: string;
|
|
240
248
|
readonly scopes: readonly string[];
|
|
249
|
+
readonly resource?: string | null | undefined;
|
|
250
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
241
251
|
})[];
|
|
242
252
|
}, import("@executor-js/sdk").IntegrationAlreadyExistsError | import("@executor-js/sdk").InternalError | import("../sdk").OpenApiParseError | import("../sdk").OpenApiExtractionError | import("../sdk").OpenApiOAuthError>;
|
|
243
253
|
export declare const openApiIntegrationFamily: (arg: string & import("effect/Brand").Brand<"IntegrationSlug">) => Atom.Atom<import("effect/unstable/reactivity/AsyncResult").AsyncResult<{
|
|
@@ -273,5 +283,7 @@ export declare const openApiConfigFamily: (arg: string & import("effect/Brand").
|
|
|
273
283
|
readonly authorizationUrl: string;
|
|
274
284
|
readonly tokenUrl: string;
|
|
275
285
|
readonly scopes: readonly string[];
|
|
286
|
+
readonly resource?: string | null | undefined;
|
|
287
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
276
288
|
})[] | undefined;
|
|
277
289
|
} | null, import("@executor-js/sdk").IntegrationAlreadyExistsError | import("@executor-js/sdk").InternalError | import("../sdk").OpenApiParseError | import("../sdk").OpenApiExtractionError | import("../sdk").OpenApiOAuthError>>;
|
package/dist/react/client.d.ts
CHANGED
|
@@ -52,9 +52,11 @@ export declare const OpenApiClient: import("effect/unstable/reactivity/AtomHttpA
|
|
|
52
52
|
readonly flow: import("effect/Schema").Literals<readonly ["authorizationCode", "clientCredentials"]>;
|
|
53
53
|
readonly authorizationUrl: import("effect/Schema").OptionFromOptional<import("effect/Schema").String>;
|
|
54
54
|
readonly tokenUrl: import("effect/Schema").String;
|
|
55
|
+
readonly resource: import("effect/Schema").OptionFromOptional<import("effect/Schema").String>;
|
|
55
56
|
readonly refreshUrl: import("effect/Schema").OptionFromOptional<import("effect/Schema").String>;
|
|
56
57
|
readonly scopes: import("effect/Schema").$Record<import("effect/Schema").String, import("effect/Schema").String>;
|
|
57
58
|
readonly identityScopes: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"auto">, import("effect/Schema").Literal<false>, import("effect/Schema").$Array<import("effect/Schema").String>]>;
|
|
59
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
58
60
|
}>>;
|
|
59
61
|
}>>, import("effect/unstable/httpapi/HttpApiEndpoint").Json<typeof import("@executor-js/sdk").IntegrationAlreadyExistsError | typeof import("@executor-js/sdk").InternalError | typeof import("../sdk").OpenApiParseError | typeof import("../sdk").OpenApiExtractionError | typeof import("../sdk").OpenApiOAuthError>, never, never> | import("effect/unstable/httpapi/HttpApiEndpoint").HttpApiEndpoint<"addSpec", "POST", "/openapi/specs", import("effect/unstable/httpapi/HttpApiEndpoint").StringTree<never>, import("effect/unstable/httpapi/HttpApiEndpoint").StringTree<never>, import("effect/unstable/httpapi/HttpApiEndpoint").Json<import("effect/Schema").Struct<{
|
|
60
62
|
readonly spec: import("effect/Schema").Union<readonly [import("effect/Schema").Struct<{
|
|
@@ -75,7 +77,9 @@ export declare const OpenApiClient: import("effect/unstable/reactivity/AtomHttpA
|
|
|
75
77
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
76
78
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
77
79
|
readonly tokenUrl: import("effect/Schema").String;
|
|
80
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
78
81
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
82
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
79
83
|
}>, import("effect/Schema").Struct<{
|
|
80
84
|
readonly slug: import("effect/Schema").optional<import("effect/Schema").String>;
|
|
81
85
|
readonly type: import("effect/Schema").Literal<"apiKey">;
|
|
@@ -112,7 +116,9 @@ export declare const OpenApiClient: import("effect/unstable/reactivity/AtomHttpA
|
|
|
112
116
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
113
117
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
114
118
|
readonly tokenUrl: import("effect/Schema").String;
|
|
119
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
115
120
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
121
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
116
122
|
}>, import("effect/Schema").Struct<{
|
|
117
123
|
readonly slug: import("effect/Schema").String;
|
|
118
124
|
readonly kind: import("effect/Schema").Literal<"apikey">;
|
|
@@ -133,7 +139,9 @@ export declare const OpenApiClient: import("effect/unstable/reactivity/AtomHttpA
|
|
|
133
139
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
134
140
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
135
141
|
readonly tokenUrl: import("effect/Schema").String;
|
|
142
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
136
143
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
144
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
137
145
|
}>, import("effect/Schema").Struct<{
|
|
138
146
|
readonly slug: import("effect/Schema").optional<import("effect/Schema").String>;
|
|
139
147
|
readonly type: import("effect/Schema").Literal<"apiKey">;
|
|
@@ -154,7 +162,9 @@ export declare const OpenApiClient: import("effect/unstable/reactivity/AtomHttpA
|
|
|
154
162
|
readonly kind: import("effect/Schema").Literal<"oauth2">;
|
|
155
163
|
readonly authorizationUrl: import("effect/Schema").String;
|
|
156
164
|
readonly tokenUrl: import("effect/Schema").String;
|
|
165
|
+
readonly resource: import("effect/Schema").optional<import("effect/Schema").NullOr<import("effect/Schema").String>>;
|
|
157
166
|
readonly scopes: import("effect/Schema").$Array<import("effect/Schema").String>;
|
|
167
|
+
readonly supportsClientIdMetadataDocument: import("effect/Schema").optional<import("effect/Schema").Boolean>;
|
|
158
168
|
}>, import("effect/Schema").Struct<{
|
|
159
169
|
readonly slug: import("effect/Schema").String;
|
|
160
170
|
readonly kind: import("effect/Schema").Literal<"apikey">;
|
package/dist/sdk/config.d.ts
CHANGED
|
@@ -5,7 +5,9 @@ export declare const AuthenticationSchema: Schema.Union<readonly [Schema.Struct<
|
|
|
5
5
|
readonly kind: Schema.Literal<"oauth2">;
|
|
6
6
|
readonly authorizationUrl: Schema.String;
|
|
7
7
|
readonly tokenUrl: Schema.String;
|
|
8
|
+
readonly resource: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
8
9
|
readonly scopes: Schema.$Array<Schema.String>;
|
|
10
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
9
11
|
}>, Schema.Struct<{
|
|
10
12
|
readonly slug: Schema.String;
|
|
11
13
|
readonly kind: Schema.Literal<"apikey">;
|
|
@@ -36,7 +38,9 @@ export declare const OpenApiIntegrationConfigSchema: Schema.Struct<{
|
|
|
36
38
|
readonly kind: Schema.Literal<"oauth2">;
|
|
37
39
|
readonly authorizationUrl: Schema.String;
|
|
38
40
|
readonly tokenUrl: Schema.String;
|
|
41
|
+
readonly resource: Schema.optional<Schema.NullOr<Schema.String>>;
|
|
39
42
|
readonly scopes: Schema.$Array<Schema.String>;
|
|
43
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
40
44
|
}>, Schema.Struct<{
|
|
41
45
|
readonly slug: Schema.String;
|
|
42
46
|
readonly kind: Schema.Literal<"apikey">;
|
package/dist/sdk/plugin.d.ts
CHANGED
|
@@ -155,6 +155,7 @@ export declare const openApiPlugin: import("@executor-js/sdk/core").ConfiguredPl
|
|
|
155
155
|
readonly secretHeaders: readonly string[];
|
|
156
156
|
}[];
|
|
157
157
|
readonly oauth2Presets: readonly {
|
|
158
|
+
readonly resource: Option.Option<string>;
|
|
158
159
|
readonly label: string;
|
|
159
160
|
readonly authorizationUrl: Option.Option<string>;
|
|
160
161
|
readonly tokenUrl: string;
|
|
@@ -165,6 +166,7 @@ export declare const openApiPlugin: import("@executor-js/sdk/core").ConfiguredPl
|
|
|
165
166
|
readonly flow: "authorizationCode" | "clientCredentials";
|
|
166
167
|
readonly identityScopes: false | "auto" | readonly string[];
|
|
167
168
|
readonly securitySchemeName: string;
|
|
169
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
168
170
|
}[];
|
|
169
171
|
readonly operationCount: number;
|
|
170
172
|
}, OpenApiParseError | OpenApiExtractionError, never>;
|
package/dist/sdk/preview.d.ts
CHANGED
|
@@ -84,12 +84,16 @@ export declare const OAuth2Preset: Schema.Struct<{
|
|
|
84
84
|
readonly authorizationUrl: Schema.OptionFromOptional<Schema.String>;
|
|
85
85
|
/** Token endpoint to exchange the code / refresh. */
|
|
86
86
|
readonly tokenUrl: Schema.String;
|
|
87
|
+
/** RFC 8707 resource indicator discovered from protected-resource metadata. */
|
|
88
|
+
readonly resource: Schema.OptionFromOptional<Schema.String>;
|
|
87
89
|
/** Optional refresh endpoint if the spec declares one separately. */
|
|
88
90
|
readonly refreshUrl: Schema.OptionFromOptional<Schema.String>;
|
|
89
91
|
/** Declared scopes for this flow: `{ scope: description }`. */
|
|
90
92
|
readonly scopes: Schema.$Record<Schema.String, Schema.String>;
|
|
91
93
|
/** Identity scopes to request alongside API scopes. `"auto"` discovers standard OIDC scopes. */
|
|
92
94
|
readonly identityScopes: Schema.Union<readonly [Schema.Literal<"auto">, Schema.Literal<false>, Schema.$Array<Schema.String>]>;
|
|
95
|
+
/** Provider metadata advertised Client ID Metadata Document support. */
|
|
96
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
93
97
|
}>;
|
|
94
98
|
export type OAuth2Preset = typeof OAuth2Preset.Type;
|
|
95
99
|
export declare const PreviewOperation: Schema.Struct<{
|
|
@@ -184,12 +188,16 @@ export declare const SpecPreview: Schema.Struct<{
|
|
|
184
188
|
readonly authorizationUrl: Schema.OptionFromOptional<Schema.String>;
|
|
185
189
|
/** Token endpoint to exchange the code / refresh. */
|
|
186
190
|
readonly tokenUrl: Schema.String;
|
|
191
|
+
/** RFC 8707 resource indicator discovered from protected-resource metadata. */
|
|
192
|
+
readonly resource: Schema.OptionFromOptional<Schema.String>;
|
|
187
193
|
/** Optional refresh endpoint if the spec declares one separately. */
|
|
188
194
|
readonly refreshUrl: Schema.OptionFromOptional<Schema.String>;
|
|
189
195
|
/** Declared scopes for this flow: `{ scope: description }`. */
|
|
190
196
|
readonly scopes: Schema.$Record<Schema.String, Schema.String>;
|
|
191
197
|
/** Identity scopes to request alongside API scopes. `"auto"` discovers standard OIDC scopes. */
|
|
192
198
|
readonly identityScopes: Schema.Union<readonly [Schema.Literal<"auto">, Schema.Literal<false>, Schema.$Array<Schema.String>]>;
|
|
199
|
+
/** Provider metadata advertised Client ID Metadata Document support. */
|
|
200
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
193
201
|
}>>;
|
|
194
202
|
}>;
|
|
195
203
|
export type SpecPreview = typeof SpecPreview.Type;
|
|
@@ -262,12 +270,16 @@ export declare const SpecPreviewSummary: Schema.Struct<{
|
|
|
262
270
|
readonly authorizationUrl: Schema.OptionFromOptional<Schema.String>;
|
|
263
271
|
/** Token endpoint to exchange the code / refresh. */
|
|
264
272
|
readonly tokenUrl: Schema.String;
|
|
273
|
+
/** RFC 8707 resource indicator discovered from protected-resource metadata. */
|
|
274
|
+
readonly resource: Schema.OptionFromOptional<Schema.String>;
|
|
265
275
|
/** Optional refresh endpoint if the spec declares one separately. */
|
|
266
276
|
readonly refreshUrl: Schema.OptionFromOptional<Schema.String>;
|
|
267
277
|
/** Declared scopes for this flow: `{ scope: description }`. */
|
|
268
278
|
readonly scopes: Schema.$Record<Schema.String, Schema.String>;
|
|
269
279
|
/** Identity scopes to request alongside API scopes. `"auto"` discovers standard OIDC scopes. */
|
|
270
280
|
readonly identityScopes: Schema.Union<readonly [Schema.Literal<"auto">, Schema.Literal<false>, Schema.$Array<Schema.String>]>;
|
|
281
|
+
/** Provider metadata advertised Client ID Metadata Document support. */
|
|
282
|
+
readonly supportsClientIdMetadataDocument: Schema.optional<Schema.Boolean>;
|
|
271
283
|
}>>;
|
|
272
284
|
}>;
|
|
273
285
|
export type SpecPreviewSummary = typeof SpecPreviewSummary.Type;
|
|
@@ -336,6 +348,7 @@ export declare const previewSpecText: (specText: string) => Effect.Effect<{
|
|
|
336
348
|
readonly secretHeaders: readonly string[];
|
|
337
349
|
}[];
|
|
338
350
|
readonly oauth2Presets: readonly {
|
|
351
|
+
readonly resource: Option.Option<string>;
|
|
339
352
|
readonly label: string;
|
|
340
353
|
readonly authorizationUrl: Option.Option<string>;
|
|
341
354
|
readonly tokenUrl: string;
|
|
@@ -346,6 +359,7 @@ export declare const previewSpecText: (specText: string) => Effect.Effect<{
|
|
|
346
359
|
readonly flow: "authorizationCode" | "clientCredentials";
|
|
347
360
|
readonly identityScopes: false | "auto" | readonly string[];
|
|
348
361
|
readonly securitySchemeName: string;
|
|
362
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
349
363
|
}[];
|
|
350
364
|
readonly operationCount: number;
|
|
351
365
|
}, import("./errors").OpenApiParseError | import("./errors").OpenApiExtractionError, never>;
|
|
@@ -413,6 +427,7 @@ export declare const previewSpec: (input: string) => Effect.Effect<{
|
|
|
413
427
|
readonly secretHeaders: readonly string[];
|
|
414
428
|
}[];
|
|
415
429
|
readonly oauth2Presets: readonly {
|
|
430
|
+
readonly resource: Option.Option<string>;
|
|
416
431
|
readonly label: string;
|
|
417
432
|
readonly authorizationUrl: Option.Option<string>;
|
|
418
433
|
readonly tokenUrl: string;
|
|
@@ -423,6 +438,7 @@ export declare const previewSpec: (input: string) => Effect.Effect<{
|
|
|
423
438
|
readonly flow: "authorizationCode" | "clientCredentials";
|
|
424
439
|
readonly identityScopes: false | "auto" | readonly string[];
|
|
425
440
|
readonly securitySchemeName: string;
|
|
441
|
+
readonly supportsClientIdMetadataDocument?: boolean | undefined;
|
|
426
442
|
}[];
|
|
427
443
|
readonly operationCount: number;
|
|
428
444
|
}, import("./errors").OpenApiParseError | import("./errors").OpenApiExtractionError, import("effect/unstable/http/HttpClient").HttpClient>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@executor-js/plugin-openapi",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
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": "
|
|
57
|
-
"@executor-js/sdk": "
|
|
56
|
+
"@executor-js/config": "2.0.0",
|
|
57
|
+
"@executor-js/sdk": "2.0.0",
|
|
58
58
|
"js-yaml": "4.1.1",
|
|
59
59
|
"lucide-react": "^1.7.0",
|
|
60
60
|
"openapi-types": "^12.1.3"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/AddOpenApiSource.tsx","../src/react/OpenApiSourceDetailsFields.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useAtomSet } from \"@effect/atom-react\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport * as Option from \"effect/Option\";\n\nimport { IntegrationSlug } from \"@executor-js/sdk/shared\";\nimport { integrationWriteKeys } from \"@executor-js/react/api/reactivity-keys\";\nimport {\n slugifyNamespace,\n useIntegrationIdentity,\n} from \"@executor-js/react/plugins/integration-identity\";\nimport { Button } from \"@executor-js/react/components/button\";\nimport {\n AuthMethodListEditor,\n useAuthMethodList,\n type AuthMethodRow,\n type AuthMethodSeed,\n} from \"@executor-js/react/components/auth-method-list-editor\";\nimport { CardStack, CardStackContent } from \"@executor-js/react/components/card-stack\";\nimport { FieldLabel } from \"@executor-js/react/components/field\";\nimport { FloatActions } from \"@executor-js/react/components/float-actions\";\nimport { Textarea } from \"@executor-js/react/components/textarea\";\nimport { IOSSpinner, Spinner } from \"@executor-js/react/components/spinner\";\nimport {\n addIntegrationErrorMessage,\n errorMessageFromExit,\n FormErrorAlert,\n SlugCollisionAlert,\n useSlugAlreadyExists,\n} from \"@executor-js/react/lib/integration-add\";\n\nimport {\n authenticationFromEditorValue,\n editorValueFromAuthentication,\n openApiWireAuthInput,\n} from \"./auth-method-config\";\nimport { addOpenApiSpec, previewOpenApiSpec } from \"./atoms\";\nimport { OpenApiSourceDetailsFields } from \"./OpenApiSourceDetailsFields\";\nimport { openApiPresets } from \"../sdk/presets\";\nimport type { SpecPreviewSummary } from \"../sdk/preview\";\nimport { type Authentication } from \"../sdk/types\";\nimport { resolveServerUrl } from \"../sdk/openapi-utils\";\nimport { detectedAuthenticationTemplates } from \"../sdk/derive-auth\";\n\nconst normalizePresetUrl = (url: string): string => {\n const trimmed = url.trim();\n if (!URL.canParse(trimmed)) return trimmed.replace(/\\/$/, \"\");\n const parsed = new URL(trimmed);\n parsed.hash = \"\";\n parsed.searchParams.sort();\n return parsed.toString().replace(/\\/$/, \"\");\n};\n\nconst specInputForAdd = (input: string) => {\n const value = input.trim();\n const parsed = Effect.runSyncExit(\n Effect.try({\n try: () => new URL(value),\n catch: () => null,\n }),\n );\n return Exit.isSuccess(parsed)\n ? { kind: \"url\" as const, url: value }\n : { kind: \"blob\" as const, value };\n};\n\n// ---------------------------------------------------------------------------\n// Component: single progressive form. Post-redesign: preview -> addSpec\n// (register the integration catalog entry with ALL detected auth methods) →\n// route to the integration's detail hub, where the user adds accounts. The add\n// flow no longer creates a connection.\n// ---------------------------------------------------------------------------\n\nexport default function AddOpenApiSource(props: {\n onComplete: (slug?: string) => void;\n onCancel: () => void;\n initialUrl?: string;\n initialPreset?: string;\n initialNamespace?: string;\n}) {\n const [specUrl, setSpecUrl] = useState(props.initialUrl ?? \"\");\n const [analyzing, setAnalyzing] = useState(false);\n const [analyzeError, setAnalyzeError] = useState<string | null>(null);\n\n // After analysis\n const [preview, setPreview] = useState<SpecPreviewSummary | null>(null);\n const [baseUrl, setBaseUrl] = useState(\"\");\n // Agent-visible description: prefilled from the spec's `info.description`\n // until the user types (null = untouched, keep deriving from the preview).\n const [descriptionDraft, setDescriptionDraft] = useState<string | null>(null);\n const identityFallbackName = preview ? Option.getOrElse(preview.title, () => \"\") : \"\";\n const identity = useIntegrationIdentity({\n fallbackName: identityFallbackName,\n fallbackNamespace: props.initialNamespace,\n });\n\n // Submit\n const [adding, setAdding] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n\n const doPreview = useAtomSet(previewOpenApiSpec, { mode: \"promiseExit\" });\n const doAdd = useAtomSet(addOpenApiSpec, { mode: \"promiseExit\" });\n\n // Keep the latest handleAnalyze in a ref so the debounced effect doesn't need\n // it as a dependency (it closes over fresh state).\n const handleAnalyzeRef = useRef<() => void>(() => {});\n\n useEffect(() => {\n const trimmed = specUrl.trim();\n if (!trimmed) return;\n if (preview) return;\n const handle = setTimeout(() => {\n handleAnalyzeRef.current();\n }, 400);\n return () => clearTimeout(handle);\n }, [specUrl, preview]);\n\n // ---- Derived state ----\n\n const previewHasNoServers = preview !== null && preview.servers.length === 0;\n // Offer the spec's servers (resolved with defaults) as base-URL choices when\n // there's more than one; a single/no server uses a plain input.\n const baseUrlOptions =\n preview && preview.servers.length > 1\n ? preview.servers.map((server) => {\n const url = resolveServerUrl(server.url, Option.getOrUndefined(server.variables), {});\n return { value: url, label: url };\n })\n : undefined;\n const firstServer = preview?.servers[0];\n const firstServerUrl = firstServer\n ? resolveServerUrl(firstServer.url, Option.getOrUndefined(firstServer.variables), {})\n : \"\";\n const previewPresetIcon =\n openApiPresets.find(\n (preset) => preset.url && normalizePresetUrl(preset.url) === normalizePresetUrl(specUrl),\n )?.icon ?? null;\n\n const resolvedBaseUrl = baseUrl.trim();\n const resolvedSourceId =\n slugifyNamespace(identity.namespace) ||\n (preview ? Option.getOrElse(preview.title, () => \"openapi\") : \"openapi\");\n const resolvedDisplayName =\n identity.name.trim() ||\n (preview ? Option.getOrElse(preview.title, () => resolvedSourceId) : resolvedSourceId);\n const resolvedDescription =\n descriptionDraft ?? (preview ? Option.getOrElse(preview.description, () => \"\") : \"\");\n\n // Register EVERY spec-detected auth method, not just a single selected one.\n // Keyed off `preview` (stable per analysis) so the memo doesn't re-run on the\n // freshly-allocated `?? []` fallback arrays.\n const authenticationTemplate: readonly Authentication[] = useMemo(\n () =>\n detectedAuthenticationTemplates(\n preview?.headerPresets ?? [],\n preview?.oauth2Presets ?? [],\n resolvedBaseUrl,\n ),\n [preview, resolvedBaseUrl],\n );\n\n // Editable auth methods, seeded from the spec-detected templates. The add flow\n // registers EVERY method (P6), so this is a LIST, preserving multi-method\n // specs (e.g. apiKey + OAuth). Each seed carries the detected template's\n // original slug, so an unedited detected method submits with its EXACT\n // original slug (preserving behavior); added methods (no seed) get a\n // deterministic fresh slug. Re-seeded whenever a fresh detection arrives\n // (keyed on the detected templates, stable per analysis + base URL).\n const authMethodSeeds: readonly AuthMethodSeed[] = useMemo(() => {\n const labels = [\n ...(preview?.headerPresets ?? []).map((preset) => preset.label),\n ...(preview?.oauth2Presets ?? []).map((preset) => preset.label),\n ];\n return authenticationTemplate.map(\n (template: Authentication, index: number): AuthMethodSeed => ({\n value: editorValueFromAuthentication(template),\n slug: String(template.slug),\n ...(labels[index] !== undefined ? { label: labels[index] } : {}),\n }),\n );\n }, [preview, authenticationTemplate]);\n const authMethodList = useAuthMethodList(authMethodSeeds);\n\n // The methods to register, mapped back to stored `Authentication[]`. Drops\n // `none` rows (nothing to register). An unedited detected method keeps its\n // original `seedSlug`; an added method gets a deterministic fresh slug.\n const editedAuthenticationTemplate: readonly Authentication[] = useMemo(() => {\n const templates: Authentication[] = [];\n authMethodList.rows.forEach((row: AuthMethodRow, index: number) => {\n const slug =\n row.seedSlug ?? (row.value.kind === \"oauth\" ? `oauth-${index}` : `apikey-${index}`);\n const template = authenticationFromEditorValue(row.value, slug);\n if (template !== null) templates.push(template);\n });\n return templates;\n }, [authMethodList.rows]);\n\n // Pre-empt the API's `IntegrationAlreadyExistsError`: adding an integration\n // whose slug already exists clobbers the existing one's connections/policies,\n // so the API blocks it. Surface that here from the tenant-scoped catalog list.\n const slugAlreadyExists = useSlugAlreadyExists(resolvedSourceId);\n\n // The base URL is optional when the spec declares servers (resolved per call);\n // required only when it doesn't.\n const canAdd =\n preview !== null && !slugAlreadyExists && (!previewHasNoServers || resolvedBaseUrl.length > 0);\n\n // ---- Handlers ----\n\n const handleAnalyze = async () => {\n setAnalyzing(true);\n setAnalyzeError(null);\n setAddError(null);\n const exit = await doPreview({ payload: { spec: specUrl } });\n if (Exit.isFailure(exit)) {\n setAnalyzeError(errorMessageFromExit(exit, \"Failed to parse spec\"));\n setAnalyzing(false);\n return;\n }\n const result = exit.value;\n setPreview(result);\n setBaseUrl(\"\");\n setAnalyzing(false);\n };\n\n handleAnalyzeRef.current = handleAnalyze;\n\n // Persist the integration and return its slug. Registers the catalog entry\n // with every detected auth method. Adding a slug that already exists is\n // rejected by the API (`IntegrationAlreadyExistsError`), surfaced inline.\n const ensureIntegration = useCallback(async (): Promise<IntegrationSlug | null> => {\n const exit = await doAdd({\n payload: {\n spec: specInputForAdd(specUrl),\n slug: resolvedSourceId,\n name: resolvedDisplayName,\n ...(resolvedDescription.trim().length > 0\n ? { description: resolvedDescription.trim() }\n : {}),\n baseUrl: resolvedBaseUrl,\n // Always send the edited method list (even empty) when the user has\n // inspected a preview: an explicit [] means \"no auth methods\", while\n // OMITTING the field tells the server to derive defaults from the\n // spec, which would silently resurrect methods the user deleted.\n // Serialize to the wire input dialect (apikey -> request-shaped).\n authenticationTemplate: editedAuthenticationTemplate.map(openApiWireAuthInput),\n },\n reactivityKeys: integrationWriteKeys,\n });\n if (Exit.isFailure(exit)) {\n setAddError(addIntegrationErrorMessage(exit, resolvedSourceId, \"Failed to add integration\"));\n return null;\n }\n return exit.value.slug;\n }, [\n specUrl,\n doAdd,\n resolvedSourceId,\n resolvedDisplayName,\n resolvedDescription,\n resolvedBaseUrl,\n editedAuthenticationTemplate,\n ]);\n\n const handleAdd = async () => {\n setAdding(true);\n setAddError(null);\n\n const integration = await ensureIntegration();\n if (!integration) {\n setAdding(false);\n return;\n }\n\n props.onComplete(String(integration));\n };\n\n // ---- Render ----\n\n return (\n <div className=\"flex flex-1 flex-col gap-6\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">Add OpenAPI Integration</h1>\n </div>\n\n {!preview ? (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <div className=\"space-y-2 p-3\">\n <FieldLabel>OpenAPI Spec</FieldLabel>\n <div className=\"relative\">\n <Textarea\n value={specUrl}\n onChange={(e) => setSpecUrl((e.target as HTMLTextAreaElement).value)}\n placeholder=\"https://api.example.com/openapi.json\"\n rows={3}\n maxRows={10}\n className=\"font-mono text-sm\"\n />\n {analyzing && (\n <div className=\"pointer-events-none absolute right-2 top-2\">\n <IOSSpinner className=\"size-4\" />\n </div>\n )}\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Paste a URL or raw JSON/YAML content.\n </p>\n </div>\n </CardStackContent>\n </CardStack>\n ) : null}\n\n {preview ? (\n <OpenApiSourceDetailsFields\n title={Option.getOrElse(preview.title, () => \"API\")}\n subtitle={`${Option.getOrElse(preview.version, () => \"\")}${\n Option.isSome(preview.version) ? \" · \" : \"\"\n }${preview.operationCount} operation${preview.operationCount !== 1 ? \"s\" : \"\"}${\n preview.tags.length > 0\n ? ` · ${preview.tags.length} tag${preview.tags.length !== 1 ? \"s\" : \"\"}`\n : \"\"\n }`}\n identity={identity}\n description={resolvedDescription}\n onDescriptionChange={setDescriptionDraft}\n baseUrl={resolvedBaseUrl}\n onBaseUrlChange={setBaseUrl}\n baseUrlOptions={baseUrlOptions}\n baseUrlLabel={previewHasNoServers ? \"Base URL\" : \"Base URL override (optional)\"}\n baseUrlPlaceholder={firstServerUrl || \"https://api.example.com\"}\n baseUrlHint={\n previewHasNoServers\n ? undefined\n : \"Overrides the spec's servers; leave empty to choose the server (and variables) per tool call.\"\n }\n baseUrlMissingMessage={\n previewHasNoServers ? \"This spec declares no servers, enter a base URL.\" : undefined\n }\n specUrl={specUrl}\n onSpecUrlChange={(value) => {\n setSpecUrl(value);\n setPreview(null);\n setBaseUrl(\"\");\n }}\n faviconIcon={previewPresetIcon}\n faviconUrl={resolvedBaseUrl || firstServerUrl}\n />\n ) : null}\n\n {analyzeError && <FormErrorAlert message={analyzeError} />}\n\n {preview && (\n <AuthMethodListEditor\n list={authMethodList}\n emptyHint=\"No authentication detected. Add a method, or add the integration without auth and connect an account from the integration page later.\"\n footerHint=\"Every method here is registered with the integration. Connect an account from the integration page after adding.\"\n />\n )}\n\n {preview && slugAlreadyExists && !adding && <SlugCollisionAlert slug={resolvedSourceId} />}\n\n {addError && <FormErrorAlert message={addError} />}\n\n <FloatActions>\n <Button variant=\"ghost\" onClick={() => props.onCancel()} disabled={adding}>\n Cancel\n </Button>\n {preview && (\n <Button onClick={() => void handleAdd()} disabled={!canAdd || adding}>\n {adding && <Spinner className=\"size-3.5\" />}\n {adding ? \"Adding...\" : \"Add integration\"}\n </Button>\n )}\n </FloatActions>\n </div>\n );\n}\n","import {\n CardStack,\n CardStackContent,\n CardStackEntry,\n CardStackEntryContent,\n CardStackEntryDescription,\n CardStackEntryField,\n CardStackEntryTitle,\n} from \"@executor-js/react/components/card-stack\";\nimport {\n FreeformCombobox,\n type FreeformComboboxOption,\n} from \"@executor-js/react/components/combobox\";\nimport { Input } from \"@executor-js/react/components/input\";\nimport { Textarea } from \"@executor-js/react/components/textarea\";\nimport { IntegrationFavicon } from \"@executor-js/react/components/integration-favicon\";\nimport {\n IntegrationIdentityFieldRows,\n type IntegrationIdentity,\n} from \"@executor-js/react/plugins/integration-identity\";\n\n/** The spec input is shown as a one-line \"Spec URL\" field only when it IS a\n * URL; pasted document content gets a multi-line editor instead. */\nconst isUrlInput = (value: string): boolean => URL.canParse(value.trim());\n\nexport function OpenApiSourceDetailsFields(props: {\n readonly title: string;\n readonly subtitle?: string;\n readonly identity: IntegrationIdentity;\n /** The integration's agent-visible description (prefilled from the spec). */\n readonly description?: string;\n readonly onDescriptionChange?: (value: string) => void;\n readonly baseUrl: string;\n readonly onBaseUrlChange: (value: string) => void;\n readonly baseUrlOptions?: readonly FreeformComboboxOption[];\n readonly baseUrlLabel?: string;\n readonly baseUrlPlaceholder?: string;\n readonly baseUrlHint?: string;\n readonly specUrl?: string;\n readonly onSpecUrlChange?: (value: string) => void;\n readonly faviconIcon?: string | null;\n readonly faviconUrl?: string;\n readonly namespaceReadOnly?: boolean;\n readonly specUrlDisabled?: boolean;\n readonly saveState?: \"idle\" | \"saving\" | \"saved\";\n readonly baseUrlMissingMessage?: string;\n readonly footer?: string;\n}) {\n const specIsUrl = props.specUrl !== undefined && isUrlInput(props.specUrl);\n\n return (\n <CardStack>\n <CardStackContent className=\"border-t-0\">\n <CardStackEntry>\n {(props.faviconIcon || props.faviconUrl) && (\n <IntegrationFavicon icon={props.faviconIcon} url={props.faviconUrl} size={16} />\n )}\n <CardStackEntryContent>\n <CardStackEntryTitle>{props.title}</CardStackEntryTitle>\n {props.subtitle && (\n <CardStackEntryDescription>{props.subtitle}</CardStackEntryDescription>\n )}\n </CardStackEntryContent>\n {props.saveState && props.saveState !== \"idle\" && (\n <span className=\"text-xs text-muted-foreground\">\n {props.saveState === \"saving\" ? \"Saving…\" : \"Saved\"}\n </span>\n )}\n </CardStackEntry>\n <IntegrationIdentityFieldRows\n identity={props.identity}\n namespaceReadOnly={props.namespaceReadOnly}\n />\n {props.onDescriptionChange && (\n <CardStackEntryField label=\"Description\">\n <Textarea\n value={props.description ?? \"\"}\n onChange={(e) => props.onDescriptionChange?.((e.target as HTMLTextAreaElement).value)}\n placeholder=\"What this API is and when to reach for it\"\n rows={2}\n maxRows={6}\n className=\"text-sm\"\n />\n </CardStackEntryField>\n )}\n <div className=\"grid grid-cols-1 md:grid-cols-2\">\n <CardStackEntryField label={props.baseUrlLabel ?? \"Base URL\"}>\n {props.baseUrlOptions && props.baseUrlOptions.length > 0 ? (\n <FreeformCombobox\n value={props.baseUrl}\n onValueChange={props.onBaseUrlChange}\n options={props.baseUrlOptions}\n placeholder={props.baseUrlPlaceholder ?? \"https://api.example.com\"}\n className=\"w-full\"\n inputClassName=\"font-mono text-sm\"\n />\n ) : (\n <Input\n value={props.baseUrl}\n onChange={(e) => props.onBaseUrlChange((e.target as HTMLInputElement).value)}\n placeholder={props.baseUrlPlaceholder ?? \"https://api.example.com\"}\n className=\"font-mono text-sm\"\n />\n )}\n\n {props.baseUrlMissingMessage && !props.baseUrl && (\n <p className=\"text-[11px] text-muted-foreground\">{props.baseUrlMissingMessage}</p>\n )}\n {props.baseUrlHint && (\n <p className=\"text-[11px] text-muted-foreground\">{props.baseUrlHint}</p>\n )}\n </CardStackEntryField>\n {specIsUrl && props.onSpecUrlChange && (\n <CardStackEntryField label=\"Spec URL\">\n <Input\n value={props.specUrl}\n onChange={(e) => props.onSpecUrlChange?.((e.target as HTMLInputElement).value)}\n placeholder=\"https://api.example.com/openapi.json\"\n className=\"font-mono text-sm\"\n disabled={props.specUrlDisabled}\n />\n </CardStackEntryField>\n )}\n </div>\n {props.specUrl !== undefined && !specIsUrl && props.onSpecUrlChange && (\n <CardStackEntryField label=\"Spec\">\n <Textarea\n value={props.specUrl}\n onChange={(e) => props.onSpecUrlChange?.((e.target as HTMLTextAreaElement).value)}\n placeholder=\"Pasted OpenAPI JSON/YAML\"\n rows={4}\n maxRows={12}\n className=\"font-mono text-xs\"\n disabled={props.specUrlDisabled}\n />\n </CardStackEntryField>\n )}\n {props.footer && (\n <CardStackEntry>\n <CardStackEntryContent>\n <CardStackEntryTitle>{props.footer}</CardStackEntryTitle>\n </CardStackEntryContent>\n </CardStackEntry>\n )}\n </CardStackContent>\n </CardStack>\n );\n}\n"],"mappings":"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","names":["CardStack","CardStackContent","Textarea","jsx","jsxs","CardStack","CardStackContent","Textarea"]}
|