@ankhorage/studio 2.4.11 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/deriveExternalApiIdFromUrl.d.ts +4 -0
- package/dist/deriveExternalApiIdFromUrl.d.ts.map +1 -0
- package/dist/deriveExternalApiIdFromUrl.js +33 -0
- package/dist/deriveExternalApiIdFromUrl.js.map +1 -0
- package/dist/externalApiApi.d.ts +5 -1
- package/dist/externalApiApi.d.ts.map +1 -1
- package/dist/externalApiApi.js +18 -0
- package/dist/externalApiApi.js.map +1 -1
- package/dist/externalApiAuthoringContracts.d.ts +18 -0
- package/dist/externalApiAuthoringContracts.d.ts.map +1 -1
- package/dist/host/apis/studioExternalApiService.d.ts +5 -1
- package/dist/host/apis/studioExternalApiService.d.ts.map +1 -1
- package/dist/host/apis/studioExternalApiService.js +78 -0
- package/dist/host/apis/studioExternalApiService.js.map +1 -1
- package/dist/host/http/apiRoutes.d.ts +1 -1
- package/dist/host/http/apiRoutes.d.ts.map +1 -1
- package/dist/host/http/apiRoutes.js +34 -1
- package/dist/host/http/apiRoutes.js.map +1 -1
- package/dist/removeExternalApi.d.ts +8 -0
- package/dist/removeExternalApi.d.ts.map +1 -0
- package/dist/removeExternalApi.js +9 -0
- package/dist/removeExternalApi.js.map +1 -0
- package/dist/ui/admin/pages/ApiCatalogCard.d.ts +7 -3
- package/dist/ui/admin/pages/ApiCatalogCard.d.ts.map +1 -1
- package/dist/ui/admin/pages/ApiCatalogCard.js +38 -5
- package/dist/ui/admin/pages/ApiCatalogCard.js.map +1 -1
- package/dist/ui/admin/pages/ApisAdminPage.d.ts +1 -1
- package/dist/ui/admin/pages/ApisAdminPage.d.ts.map +1 -1
- package/dist/ui/admin/pages/ApisAdminPage.js +88 -9
- package/dist/ui/admin/pages/ApisAdminPage.js.map +1 -1
- package/dist/ui/admin/pages/ExternalApiConnectCard.d.ts +12 -2
- package/dist/ui/admin/pages/ExternalApiConnectCard.d.ts.map +1 -1
- package/dist/ui/admin/pages/ExternalApiConnectCard.js +35 -31
- package/dist/ui/admin/pages/ExternalApiConnectCard.js.map +1 -1
- package/dist/ui/admin/pages/ExternalApiEditCard.d.ts +13 -0
- package/dist/ui/admin/pages/ExternalApiEditCard.d.ts.map +1 -0
- package/dist/ui/admin/pages/ExternalApiEditCard.js +103 -0
- package/dist/ui/admin/pages/ExternalApiEditCard.js.map +1 -0
- package/dist/ui/admin/pages/ManualRestApiCard.d.ts +9 -2
- package/dist/ui/admin/pages/ManualRestApiCard.d.ts.map +1 -1
- package/dist/ui/admin/pages/ManualRestApiCard.js +24 -20
- package/dist/ui/admin/pages/ManualRestApiCard.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,22 +1,101 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { ConfirmDialog, Text } from '@ankhorage/zora';
|
|
3
|
+
import React, { useCallback, useState } from 'react';
|
|
4
|
+
import { View } from 'react-native';
|
|
3
5
|
import { useStudio } from '../../../core/StudioContext';
|
|
6
|
+
import { removeExternalApiConnection } from '../../../externalApiApi';
|
|
4
7
|
import { AdminHeader, AdminScroll } from '../adminPagePrimitives';
|
|
5
8
|
import { ApiCatalogCard } from './ApiCatalogCard';
|
|
6
9
|
import { ApiOperationsCard } from './ApiOperationsCard';
|
|
7
10
|
import { ExternalApiConnectCard } from './ExternalApiConnectCard';
|
|
11
|
+
import { ExternalApiEditCard } from './ExternalApiEditCard';
|
|
8
12
|
import { ManualRestApiCard } from './ManualRestApiCard';
|
|
9
|
-
/*** Compose API
|
|
13
|
+
/*** Compose progressive API discovery, canonical endpoint catalog, advanced editing, removal, and secondary operation testing. */
|
|
10
14
|
export function ApisAdminPage({ routeId }) {
|
|
11
15
|
const studio = useStudio();
|
|
12
16
|
const apis = studio.manifest?.infra.apis ?? [];
|
|
17
|
+
const [fallback, setFallback] = useState(null);
|
|
18
|
+
const [editingApiId, setEditingApiId] = useState(null);
|
|
19
|
+
const [pendingRemoveId, setPendingRemoveId] = useState(null);
|
|
20
|
+
const [removeBusy, setRemoveBusy] = useState(false);
|
|
21
|
+
const [removeError, setRemoveError] = useState(null);
|
|
22
|
+
const [status, setStatus] = useState(null);
|
|
13
23
|
const showAuthoring = routeId === 'apis';
|
|
14
24
|
const showCatalog = routeId === 'apis' || routeId === 'api-catalog';
|
|
15
|
-
const showOperations = routeId === '
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
const showOperations = routeId === 'api-operations';
|
|
26
|
+
const editingApi = apis.find((api) => api.id === editingApiId);
|
|
27
|
+
const editableApi = editingApi?.origin === 'external' ? editingApi : null;
|
|
28
|
+
const pendingRemoveApi = apis.find((api) => api.id === pendingRemoveId);
|
|
29
|
+
/*** Clear transient fallback/edit state after a successful API add or manual fallback save. */
|
|
30
|
+
const finishConnection = useCallback((apiId) => {
|
|
31
|
+
setFallback(null);
|
|
32
|
+
setEditingApiId(null);
|
|
33
|
+
setStatus(`API ${apiId} is connected.`);
|
|
34
|
+
}, []);
|
|
35
|
+
/*** Open the advanced settings disclosure for exactly one existing external API. */
|
|
36
|
+
const editApi = useCallback((apiId) => {
|
|
37
|
+
setFallback(null);
|
|
38
|
+
setStatus(null);
|
|
39
|
+
setEditingApiId(apiId);
|
|
40
|
+
}, []);
|
|
41
|
+
/*** Prepare an accessible destructive confirmation for one external API. */
|
|
42
|
+
const requestRemove = useCallback((apiId) => {
|
|
43
|
+
setRemoveError(null);
|
|
44
|
+
setPendingRemoveId(apiId);
|
|
45
|
+
}, []);
|
|
46
|
+
/*** Remove the confirmed external API through the canonical host mutation and refresh manifest state before reporting success. */
|
|
47
|
+
const confirmRemove = useCallback(async () => {
|
|
48
|
+
if (!pendingRemoveId || removeBusy)
|
|
49
|
+
return;
|
|
50
|
+
setRemoveBusy(true);
|
|
51
|
+
setRemoveError(null);
|
|
52
|
+
try {
|
|
53
|
+
const result = await removeExternalApiConnection(studio.projectId, {
|
|
54
|
+
apiId: pendingRemoveId,
|
|
55
|
+
});
|
|
56
|
+
if (!result.ok) {
|
|
57
|
+
setRemoveError(result.diagnostics[0]?.message ?? 'API removal failed.');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await studio.refetchManifest();
|
|
61
|
+
if (editingApiId === result.apiId)
|
|
62
|
+
setEditingApiId(null);
|
|
63
|
+
if (fallback?.apiId === result.apiId)
|
|
64
|
+
setFallback(null);
|
|
65
|
+
setPendingRemoveId(null);
|
|
66
|
+
setStatus(`API ${result.apiId} was removed.`);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
setRemoveError(error instanceof Error ? error.message : 'API removal failed.');
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
setRemoveBusy(false);
|
|
73
|
+
}
|
|
74
|
+
}, [editingApiId, fallback?.apiId, pendingRemoveId, removeBusy, studio]);
|
|
75
|
+
/*** Close removal confirmation unless its canonical mutation is currently in progress. */
|
|
76
|
+
const cancelRemove = useCallback(() => {
|
|
77
|
+
if (removeBusy)
|
|
78
|
+
return;
|
|
79
|
+
setPendingRemoveId(null);
|
|
80
|
+
setRemoveError(null);
|
|
81
|
+
}, [removeBusy]);
|
|
82
|
+
return (_jsxs(_Fragment, { children: [_jsxs(AdminScroll, { children: [_jsx(AdminHeader, { title: routeId === 'api-operations'
|
|
83
|
+
? 'Operations'
|
|
84
|
+
: routeId === 'api-catalog'
|
|
85
|
+
? 'API catalog'
|
|
86
|
+
: 'APIs', description: routeId === 'api-operations'
|
|
87
|
+
? 'Test canonical API operations without mixing execution controls into the connection workflow.'
|
|
88
|
+
: 'Connect services from a URL, inspect discovered endpoints, and reveal advanced settings only when needed.' }), showAuthoring ? (_jsx(ExternalApiConnectCard, { onConnected: finishConnection, onDiscoveryFailed: (failure) => {
|
|
89
|
+
setFallback(failure);
|
|
90
|
+
setStatus(null);
|
|
91
|
+
}, onResetFailure: () => {
|
|
92
|
+
setFallback(null);
|
|
93
|
+
setStatus(null);
|
|
94
|
+
} })) : null, showAuthoring && fallback ? (_jsx(ManualRestApiCard, { apiId: fallback.apiId, attemptedUrl: fallback.url, onRetry: () => setFallback(null), onSaved: finishConnection })) : null, _jsx(View, { accessibilityLiveRegion: "polite", children: status ? _jsx(Text, { variant: "bodySmall", children: status }) : null }), showCatalog ? (_jsx(ApiCatalogCard, { apis: apis, onEdit: editApi, onRemove: requestRemove })) : null, showCatalog && editableApi ? (_jsx(ExternalApiEditCard, { api: editableApi, onCancel: () => setEditingApiId(null), onSaved: (apiId) => {
|
|
95
|
+
setEditingApiId(null);
|
|
96
|
+
setStatus(`API ${apiId} settings were updated.`);
|
|
97
|
+
} }, editableApi.id)) : null, showOperations ? _jsx(ApiOperationsCard, { apis: apis }) : null] }), _jsx(ConfirmDialog, { visible: pendingRemoveId !== null, title: "Remove API?", description: pendingRemoveApi
|
|
98
|
+
? `Remove ${pendingRemoveApi.name ?? pendingRemoveApi.id} from the canonical project manifest? Existing bindings to this API will no longer resolve.`
|
|
99
|
+
: undefined, confirmLabel: "Remove API", confirmColor: "danger", busy: removeBusy, onCancel: cancelRemove, onConfirm: () => void confirmRemove(), children: removeError ? _jsx(Text, { color: "danger", children: removeError }) : null })] }));
|
|
21
100
|
}
|
|
22
101
|
//# sourceMappingURL=ApisAdminPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApisAdminPage.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ApisAdminPage.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ApisAdminPage.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ApisAdminPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
interface ExternalApiDiscoveryFailure {
|
|
2
|
+
readonly apiId: string;
|
|
3
|
+
readonly url: string;
|
|
4
|
+
}
|
|
5
|
+
interface ExternalApiConnectCardProps {
|
|
6
|
+
readonly onConnected: (apiId: string) => void;
|
|
7
|
+
readonly onDiscoveryFailed: (failure: ExternalApiDiscoveryFailure) => void;
|
|
8
|
+
readonly onResetFailure: () => void;
|
|
9
|
+
}
|
|
10
|
+
/*** Render URL-first external API discovery and persist the discovered canonical definition before exposing advanced authoring. */
|
|
11
|
+
export declare function ExternalApiConnectCard({ onConnected, onDiscoveryFailed, onResetFailure, }: ExternalApiConnectCardProps): import("react").JSX.Element;
|
|
12
|
+
export {};
|
|
3
13
|
//# sourceMappingURL=ExternalApiConnectCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalApiConnectCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ExternalApiConnectCard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExternalApiConnectCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ExternalApiConnectCard.tsx"],"names":[],"mappings":"AAcA,UAAU,2BAA2B;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,2BAA2B;IACnC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAC3E,QAAQ,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC;CACrC;AAED,mIAAmI;AACnI,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,EAAE,2BAA2B,+BAuF7B"}
|
|
@@ -1,59 +1,63 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button, Card,
|
|
2
|
+
import { Button, Card, Text, TextInput } from '@ankhorage/zora';
|
|
3
3
|
import { useCallback, useState } from 'react';
|
|
4
4
|
import { View } from 'react-native';
|
|
5
5
|
import { useStudio } from '../../../core/StudioContext';
|
|
6
|
+
import { deriveExternalApiIdFromUrl } from '../../../deriveExternalApiIdFromUrl';
|
|
6
7
|
import { connectExternalApi } from '../../../externalApiApi';
|
|
7
8
|
import { ExternalApiDiagnosticList, ExternalApiField, externalApiAdminStyles, } from './ExternalApiAdminPrimitives';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{ value: 'openapi', label: 'OpenAPI' },
|
|
11
|
-
{ value: 'graphql', label: 'GraphQL introspection' },
|
|
12
|
-
];
|
|
13
|
-
/*** Render the external-API discovery/connect form and refresh the Studio manifest after a successful connection. */
|
|
14
|
-
export function ExternalApiConnectCard() {
|
|
9
|
+
/*** Render URL-first external API discovery and persist the discovered canonical definition before exposing advanced authoring. */
|
|
10
|
+
export function ExternalApiConnectCard({ onConnected, onDiscoveryFailed, onResetFailure, }) {
|
|
15
11
|
const studio = useStudio();
|
|
16
|
-
const [apiId, setApiId] = useState('');
|
|
17
12
|
const [url, setUrl] = useState('');
|
|
18
|
-
const [name, setName] = useState('');
|
|
19
|
-
const [protocol, setProtocol] = useState('auto');
|
|
20
|
-
const [credentialId, setCredentialId] = useState('');
|
|
21
|
-
const [credentialKind, setCredentialKind] = useState('bearer');
|
|
22
|
-
const [credentialScope, setCredentialScope] = useState('');
|
|
23
13
|
const [result, setResult] = useState(null);
|
|
24
14
|
const [message, setMessage] = useState(null);
|
|
25
15
|
const [busy, setBusy] = useState(false);
|
|
26
|
-
/***
|
|
27
|
-
const
|
|
16
|
+
/*** Reset stale discovery feedback whenever the URL draft changes while preserving the user's current input. */
|
|
17
|
+
const changeUrl = useCallback((value) => {
|
|
18
|
+
setUrl(value);
|
|
19
|
+
setResult(null);
|
|
20
|
+
setMessage(null);
|
|
21
|
+
onResetFailure();
|
|
22
|
+
}, [onResetFailure]);
|
|
23
|
+
/*** Derive the canonical API id, run automatic discovery once, and refresh manifest state after successful persistence. */
|
|
24
|
+
const discover = useCallback(async () => {
|
|
25
|
+
if (busy)
|
|
26
|
+
return;
|
|
27
|
+
const normalizedUrl = url.trim();
|
|
28
|
+
const derived = deriveExternalApiIdFromUrl(normalizedUrl);
|
|
29
|
+
if (!derived.ok) {
|
|
30
|
+
setResult(null);
|
|
31
|
+
setMessage(derived.message);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
28
34
|
setBusy(true);
|
|
29
35
|
setMessage(null);
|
|
30
36
|
try {
|
|
31
37
|
const next = await connectExternalApi(studio.projectId, {
|
|
32
|
-
apiId,
|
|
33
|
-
url,
|
|
34
|
-
protocol,
|
|
35
|
-
name: name.trim() || undefined,
|
|
36
|
-
credential: credentialId.trim()
|
|
37
|
-
? {
|
|
38
|
-
id: credentialId.trim(),
|
|
39
|
-
kind: credentialKind.trim() || 'bearer',
|
|
40
|
-
scope: credentialScope.trim() || undefined,
|
|
41
|
-
}
|
|
42
|
-
: undefined,
|
|
38
|
+
apiId: derived.apiId,
|
|
39
|
+
url: normalizedUrl,
|
|
40
|
+
protocol: 'auto',
|
|
43
41
|
});
|
|
44
42
|
setResult(next);
|
|
45
43
|
if (next.ok) {
|
|
46
44
|
await studio.refetchManifest();
|
|
47
|
-
setMessage(
|
|
45
|
+
setMessage(`Connected ${next.apiId} as ${next.protocol}.`);
|
|
46
|
+
onConnected(next.apiId);
|
|
47
|
+
return;
|
|
48
48
|
}
|
|
49
|
+
setMessage('Automatic discovery did not find a supported API definition.');
|
|
50
|
+
onDiscoveryFailed({ apiId: derived.apiId, url: normalizedUrl });
|
|
49
51
|
}
|
|
50
52
|
catch (error) {
|
|
51
|
-
|
|
53
|
+
setResult(null);
|
|
54
|
+
setMessage(error instanceof Error ? error.message : 'External API discovery failed.');
|
|
55
|
+
onDiscoveryFailed({ apiId: derived.apiId, url: normalizedUrl });
|
|
52
56
|
}
|
|
53
57
|
finally {
|
|
54
58
|
setBusy(false);
|
|
55
59
|
}
|
|
56
|
-
}, [
|
|
57
|
-
return (_jsx(Card, { title: "Connect
|
|
60
|
+
}, [busy, onConnected, onDiscoveryFailed, studio, url]);
|
|
61
|
+
return (_jsx(Card, { title: "Connect an API", description: "Start with the service or schema URL. Studio derives the API ID and discovers the protocol automatically.", children: _jsxs(View, { style: externalApiAdminStyles.stack, children: [_jsx(ExternalApiField, { label: "Service or schema URL", children: _jsx(TextInput, { accessibilityLabel: "Service or schema URL", value: url, autoCapitalize: "none", autoCorrect: false, placeholder: "https://api.example.com/openapi.json", onChangeText: changeUrl, onSubmitEditing: () => void discover() }) }), _jsx(View, { style: externalApiAdminStyles.actions, children: _jsx(Button, { loading: busy, disabled: busy || !url.trim(), onPress: () => void discover(), children: "Discover API" }) }), _jsxs(View, { accessibilityLiveRegion: "polite", children: [busy ? _jsx(Text, { variant: "bodySmall", children: "Discovering API\u2026" }) : null, message ? _jsx(Text, { variant: "bodySmall", children: message }) : null] }), result ? (_jsx(ExternalApiDiagnosticList, { diagnostics: result.diagnostics, attempts: result.attempts })) : null] }) }));
|
|
58
62
|
}
|
|
59
63
|
//# sourceMappingURL=ExternalApiConnectCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalApiConnectCard.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ExternalApiConnectCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"ExternalApiConnectCard.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ExternalApiConnectCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ApiDefinition } from '@ankhorage/contracts/data';
|
|
2
|
+
type ExternalApiDefinition = Extract<ApiDefinition, {
|
|
3
|
+
readonly origin: 'external';
|
|
4
|
+
}>;
|
|
5
|
+
interface ExternalApiEditCardProps {
|
|
6
|
+
readonly api: ExternalApiDefinition;
|
|
7
|
+
readonly onCancel: () => void;
|
|
8
|
+
readonly onSaved: (apiId: string) => void;
|
|
9
|
+
}
|
|
10
|
+
/*** Render advanced settings for one selected canonical external API and persist edits without introducing a parallel model. */
|
|
11
|
+
export declare function ExternalApiEditCard({ api, onCancel, onSaved }: ExternalApiEditCardProps): import("react").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=ExternalApiEditCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalApiEditCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ExternalApiEditCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAcrF,KAAK,qBAAqB,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAErF,UAAU,wBAAwB;IAChC,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,gIAAgI;AAChI,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,wBAAwB,+BA6KvF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, ButtonGroup, Card, Select, Text, TextInput } from '@ankhorage/zora';
|
|
3
|
+
import { useCallback, useState } from 'react';
|
|
4
|
+
import { View } from 'react-native';
|
|
5
|
+
import { useStudio } from '../../../core/StudioContext';
|
|
6
|
+
import { connectExternalApi, updateManualRestApi } from '../../../externalApiApi';
|
|
7
|
+
import { externalApiAdminStyles, ExternalApiDiagnosticList, ExternalApiField, } from './ExternalApiAdminPrimitives';
|
|
8
|
+
/*** Render advanced settings for one selected canonical external API and persist edits without introducing a parallel model. */
|
|
9
|
+
export function ExternalApiEditCard({ api, onCancel, onSaved }) {
|
|
10
|
+
const studio = useStudio();
|
|
11
|
+
const isManualRest = api.protocol === 'rest' && !api.openApi;
|
|
12
|
+
const [url, setUrl] = useState(resolveExternalApiSourceUrl(api));
|
|
13
|
+
const [name, setName] = useState(api.name ?? '');
|
|
14
|
+
const [description, setDescription] = useState(api.description ?? '');
|
|
15
|
+
const [protocol, setProtocol] = useState(resolveDiscoveryProtocol(api));
|
|
16
|
+
const [credentialId, setCredentialId] = useState(api.credential?.id ?? '');
|
|
17
|
+
const [credentialLabel, setCredentialLabel] = useState(api.credential?.label ?? '');
|
|
18
|
+
const [credentialKind, setCredentialKind] = useState(api.credential?.kind ?? 'bearer');
|
|
19
|
+
const [credentialScope, setCredentialScope] = useState(api.credential?.scope ?? '');
|
|
20
|
+
const [diagnostics, setDiagnostics] = useState([]);
|
|
21
|
+
const [message, setMessage] = useState(null);
|
|
22
|
+
const [busy, setBusy] = useState(false);
|
|
23
|
+
/*** Persist manual settings in place or rediscover an imported API under its existing canonical id. */
|
|
24
|
+
const save = useCallback(async () => {
|
|
25
|
+
if (busy)
|
|
26
|
+
return;
|
|
27
|
+
setBusy(true);
|
|
28
|
+
setMessage(null);
|
|
29
|
+
setDiagnostics([]);
|
|
30
|
+
const credential = credentialId.trim()
|
|
31
|
+
? {
|
|
32
|
+
id: credentialId.trim(),
|
|
33
|
+
label: credentialLabel.trim() || undefined,
|
|
34
|
+
kind: credentialKind.trim() || 'bearer',
|
|
35
|
+
scope: credentialScope.trim() || undefined,
|
|
36
|
+
}
|
|
37
|
+
: undefined;
|
|
38
|
+
try {
|
|
39
|
+
const next = isManualRest
|
|
40
|
+
? await updateManualRestApi(studio.projectId, {
|
|
41
|
+
apiId: api.id,
|
|
42
|
+
baseUrl: url,
|
|
43
|
+
name: name.trim() || undefined,
|
|
44
|
+
description: description.trim() || undefined,
|
|
45
|
+
credential,
|
|
46
|
+
})
|
|
47
|
+
: await connectExternalApi(studio.projectId, {
|
|
48
|
+
apiId: api.id,
|
|
49
|
+
url,
|
|
50
|
+
protocol,
|
|
51
|
+
name: name.trim() || undefined,
|
|
52
|
+
description: description.trim() || undefined,
|
|
53
|
+
credential,
|
|
54
|
+
});
|
|
55
|
+
setDiagnostics(next.diagnostics);
|
|
56
|
+
if (next.ok) {
|
|
57
|
+
await studio.refetchManifest();
|
|
58
|
+
onSaved(next.apiId);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
setMessage(next.diagnostics[0]?.message ?? 'API settings could not be updated.');
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
setMessage(error instanceof Error ? error.message : 'API settings could not be updated.');
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
setBusy(false);
|
|
68
|
+
}
|
|
69
|
+
}, [
|
|
70
|
+
api.id,
|
|
71
|
+
busy,
|
|
72
|
+
credentialId,
|
|
73
|
+
credentialKind,
|
|
74
|
+
credentialLabel,
|
|
75
|
+
credentialScope,
|
|
76
|
+
description,
|
|
77
|
+
isManualRest,
|
|
78
|
+
name,
|
|
79
|
+
onSaved,
|
|
80
|
+
protocol,
|
|
81
|
+
studio,
|
|
82
|
+
url,
|
|
83
|
+
]);
|
|
84
|
+
return (_jsx(Card, { title: `Edit ${api.name ?? api.id}`, description: "Advanced settings are shown only for the selected connected API. Imported endpoints and schemas remain canonical and read-only.", children: _jsxs(View, { style: externalApiAdminStyles.stack, children: [_jsx(ExternalApiField, { label: "Generated API ID", children: _jsx(Text, { selectable: true, variant: "bodySmall", children: api.id }) }), _jsx(ExternalApiField, { label: "Service or schema URL", children: _jsx(TextInput, { accessibilityLabel: "Service or schema URL", value: url, autoCapitalize: "none", autoCorrect: false, onChangeText: setUrl }) }), _jsxs(View, { style: externalApiAdminStyles.columns, children: [_jsx(ExternalApiField, { label: "Display name (optional)", children: _jsx(TextInput, { accessibilityLabel: "API display name", value: name, onChangeText: setName }) }), _jsx(ExternalApiField, { label: "Protocol discovery strategy", children: isManualRest ? (_jsx(Text, { variant: "bodySmall", children: "Manual REST" })) : (_jsx(Select, { value: protocol, options: PROTOCOL_OPTIONS, onValueChange: setProtocol })) })] }), _jsx(ExternalApiField, { label: "Description (optional)", children: _jsx(TextInput, { accessibilityLabel: "API description", value: description, multiline: true, onChangeText: setDescription }) }), _jsxs(View, { style: externalApiAdminStyles.columns, children: [_jsx(ExternalApiField, { label: "Credential secret ref (optional)", children: _jsx(TextInput, { accessibilityLabel: "Credential secret reference", value: credentialId, autoCapitalize: "none", autoCorrect: false, placeholder: "services/example", onChangeText: setCredentialId }) }), _jsx(ExternalApiField, { label: "Credential label (optional)", children: _jsx(TextInput, { accessibilityLabel: "Credential label", value: credentialLabel, onChangeText: setCredentialLabel }) }), _jsx(ExternalApiField, { label: "Credential kind", children: _jsx(TextInput, { accessibilityLabel: "Credential kind", value: credentialKind, autoCapitalize: "none", autoCorrect: false, onChangeText: setCredentialKind }) }), _jsx(ExternalApiField, { label: "Credential scope (optional)", children: _jsx(TextInput, { accessibilityLabel: "Credential scope", value: credentialScope, autoCapitalize: "none", autoCorrect: false, placeholder: "header:x-api-key", onChangeText: setCredentialScope }) })] }), _jsx(Text, { color: "neutral", emphasis: "muted", variant: "caption", children: "Saving a discovered OpenAPI or GraphQL API runs discovery again under the same generated ID, so source URL, protocol, schemas, and operations stay consistent. Manual REST settings update in place and preserve authored operations." }), _jsxs(ButtonGroup, { orientation: "responsive", align: "end", children: [_jsx(Button, { variant: "ghost", disabled: busy, onPress: onCancel, children: "Cancel" }), _jsx(Button, { loading: busy, disabled: busy || !url.trim(), onPress: () => void save(), children: "Save changes" })] }), _jsx(View, { accessibilityLiveRegion: "polite", children: message ? _jsx(Text, { variant: "bodySmall", children: message }) : null }), _jsx(ExternalApiDiagnosticList, { diagnostics: diagnostics })] }) }));
|
|
85
|
+
}
|
|
86
|
+
const PROTOCOL_OPTIONS = [
|
|
87
|
+
{ value: 'auto', label: 'Auto: OpenAPI, then GraphQL' },
|
|
88
|
+
{ value: 'openapi', label: 'OpenAPI' },
|
|
89
|
+
{ value: 'graphql', label: 'GraphQL introspection' },
|
|
90
|
+
];
|
|
91
|
+
/*** Resolve the editable source URL from an external API's protocol-specific canonical definition. */
|
|
92
|
+
function resolveExternalApiSourceUrl(api) {
|
|
93
|
+
if (api.protocol === 'graphql')
|
|
94
|
+
return api.endpointUrl;
|
|
95
|
+
return api.openApi?.url ?? api.baseUrl;
|
|
96
|
+
}
|
|
97
|
+
/*** Resolve the initial discovery strategy represented by one imported external API definition. */
|
|
98
|
+
function resolveDiscoveryProtocol(api) {
|
|
99
|
+
if (api.protocol === 'graphql')
|
|
100
|
+
return 'graphql';
|
|
101
|
+
return api.openApi ? 'openapi' : 'auto';
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ExternalApiEditCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalApiEditCard.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ExternalApiEditCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAUtC,gIAAgI;AAChI,MAAM,UAAU,mBAAmB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAA4B;IACtF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAsB,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,IAAI,QAAQ,CAAC,CAAC;IACvF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAkC,EAAE,CAAC,CAAC;IACpF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExC,uGAAuG;IACvG,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAClC,IAAI,IAAI;YAAE,OAAO;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE;YACpC,CAAC,CAAC;gBACE,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE;gBACvB,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,SAAS;gBAC1C,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,QAAQ;gBACvC,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,SAAS;aAC3C;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY;gBACvB,CAAC,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,SAAS,EAAE;oBAC1C,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,OAAO,EAAE,GAAG;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS;oBAC9B,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,SAAS;oBAC5C,UAAU;iBACX,CAAC;gBACJ,CAAC,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE;oBACzC,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,GAAG;oBACH,QAAQ;oBACR,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS;oBAC9B,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,SAAS;oBAC5C,UAAU;iBACX,CAAC,CAAC;YACP,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,oCAAoC,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC;QAC5F,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,EAAE;QACD,GAAG,CAAC,EAAE;QACN,IAAI;QACJ,YAAY;QACZ,cAAc;QACd,eAAe;QACf,eAAe;QACf,WAAW;QACX,YAAY;QACZ,IAAI;QACJ,OAAO;QACP,QAAQ;QACR,MAAM;QACN,GAAG;KACJ,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,IAAI,IACH,KAAK,EAAE,QAAQ,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,EACnC,WAAW,EAAC,iIAAiI,YAE7I,MAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,KAAK,aACvC,KAAC,gBAAgB,IAAC,KAAK,EAAC,kBAAkB,YACxC,KAAC,IAAI,IAAC,UAAU,QAAC,OAAO,EAAC,WAAW,YACjC,GAAG,CAAC,EAAE,GACF,GACU,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,uBAAuB,YAC7C,KAAC,SAAS,IACR,kBAAkB,EAAC,uBAAuB,EAC1C,KAAK,EAAE,GAAG,EACV,cAAc,EAAC,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,YAAY,EAAE,MAAM,GACpB,GACe,EACnB,MAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,OAAO,aACzC,KAAC,gBAAgB,IAAC,KAAK,EAAC,yBAAyB,YAC/C,KAAC,SAAS,IAAC,kBAAkB,EAAC,kBAAkB,EAAC,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,GAAI,GACtE,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,6BAA6B,YAClD,YAAY,CAAC,CAAC,CAAC,CACd,KAAC,IAAI,IAAC,OAAO,EAAC,WAAW,4BAAmB,CAC7C,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,GAAI,CACnF,GACgB,IACd,EACP,KAAC,gBAAgB,IAAC,KAAK,EAAC,wBAAwB,YAC9C,KAAC,SAAS,IACR,kBAAkB,EAAC,iBAAiB,EACpC,KAAK,EAAE,WAAW,EAClB,SAAS,QACT,YAAY,EAAE,cAAc,GAC5B,GACe,EACnB,MAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,OAAO,aACzC,KAAC,gBAAgB,IAAC,KAAK,EAAC,kCAAkC,YACxD,KAAC,SAAS,IACR,kBAAkB,EAAC,6BAA6B,EAChD,KAAK,EAAE,YAAY,EACnB,cAAc,EAAC,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,WAAW,EAAC,kBAAkB,EAC9B,YAAY,EAAE,eAAe,GAC7B,GACe,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,6BAA6B,YACnD,KAAC,SAAS,IACR,kBAAkB,EAAC,kBAAkB,EACrC,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,kBAAkB,GAChC,GACe,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,iBAAiB,YACvC,KAAC,SAAS,IACR,kBAAkB,EAAC,iBAAiB,EACpC,KAAK,EAAE,cAAc,EACrB,cAAc,EAAC,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,YAAY,EAAE,iBAAiB,GAC/B,GACe,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,6BAA6B,YACnD,KAAC,SAAS,IACR,kBAAkB,EAAC,kBAAkB,EACrC,KAAK,EAAE,eAAe,EACtB,cAAc,EAAC,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,WAAW,EAAC,kBAAkB,EAC9B,YAAY,EAAE,kBAAkB,GAChC,GACe,IACd,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,SAAS,sPAIjD,EACP,MAAC,WAAW,IAAC,WAAW,EAAC,YAAY,EAAC,KAAK,EAAC,KAAK,aAC/C,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,uBAEhD,EACT,KAAC,MAAM,IAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,6BAEvE,IACG,EACd,KAAC,IAAI,IAAC,uBAAuB,EAAC,QAAQ,YACnC,OAAO,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,OAAO,EAAC,WAAW,YAAE,OAAO,GAAQ,CAAC,CAAC,CAAC,IAAI,GACvD,EACP,KAAC,yBAAyB,IAAC,WAAW,EAAE,WAAW,GAAI,IAClD,GACF,CACR,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB,GAA6D;IACjF,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,6BAA6B,EAAE;IACvD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACtC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE;CACrD,CAAC;AAEF,sGAAsG;AACtG,SAAS,2BAA2B,CAAC,GAA0B;IAC7D,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC;IACvD,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,mGAAmG;AACnG,SAAS,wBAAwB,CAAC,GAA0B;IAC1D,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1C,CAAC"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
interface ManualRestApiCardProps {
|
|
2
|
+
readonly apiId: string;
|
|
3
|
+
readonly attemptedUrl: string;
|
|
4
|
+
readonly onRetry: () => void;
|
|
5
|
+
readonly onSaved: (apiId: string) => void;
|
|
6
|
+
}
|
|
7
|
+
/*** Render a focused manual REST fallback after automatic discovery fails, retaining the attempted URL and canonical API id. */
|
|
8
|
+
export declare function ManualRestApiCard({ apiId, attemptedUrl, onRetry, onSaved, }: ManualRestApiCardProps): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
3
10
|
//# sourceMappingURL=ManualRestApiCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManualRestApiCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ManualRestApiCard.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ManualRestApiCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ManualRestApiCard.tsx"],"names":[],"mappings":"AAcA,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,gIAAgI;AAChI,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,EACZ,OAAO,EACP,OAAO,GACR,EAAE,sBAAsB,+BAyHxB"}
|
|
@@ -1,26 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button,
|
|
2
|
+
import { Button, ButtonGroup, Card, Select, Text, TextInput } from '@ankhorage/zora';
|
|
3
3
|
import { useCallback, useState } from 'react';
|
|
4
4
|
import { View } from 'react-native';
|
|
5
5
|
import { useStudio } from '../../../core/StudioContext';
|
|
6
6
|
import { createManualRestApi } from '../../../externalApiApi';
|
|
7
7
|
import { ExternalApiDiagnosticList, ExternalApiField, externalApiAdminStyles, } from './ExternalApiAdminPrimitives';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
label: value,
|
|
11
|
-
}));
|
|
12
|
-
const INTENT_OPTIONS = [
|
|
13
|
-
{ value: 'read', label: 'Read' },
|
|
14
|
-
{ value: 'create', label: 'Create' },
|
|
15
|
-
{ value: 'update', label: 'Update' },
|
|
16
|
-
{ value: 'delete', label: 'Delete' },
|
|
17
|
-
{ value: 'action', label: 'Action' },
|
|
18
|
-
];
|
|
19
|
-
/*** Render manual REST API authoring for services without OpenAPI discovery and refresh canonical Studio state after success. */
|
|
20
|
-
export function ManualRestApiCard() {
|
|
8
|
+
/*** Render a focused manual REST fallback after automatic discovery fails, retaining the attempted URL and canonical API id. */
|
|
9
|
+
export function ManualRestApiCard({ apiId, attemptedUrl, onRetry, onSaved, }) {
|
|
21
10
|
const studio = useStudio();
|
|
22
|
-
const [
|
|
23
|
-
const [baseUrl, setBaseUrl] = useState('');
|
|
11
|
+
const [baseUrl, setBaseUrl] = useState(attemptedUrl);
|
|
24
12
|
const [endpointId, setEndpointId] = useState('root');
|
|
25
13
|
const [path, setPath] = useState('/');
|
|
26
14
|
const [operationId, setOperationId] = useState('get-root');
|
|
@@ -29,8 +17,10 @@ export function ManualRestApiCard() {
|
|
|
29
17
|
const [result, setResult] = useState(null);
|
|
30
18
|
const [message, setMessage] = useState(null);
|
|
31
19
|
const [busy, setBusy] = useState(false);
|
|
32
|
-
/*** Persist the
|
|
20
|
+
/*** Persist the focused manual REST fallback and refresh the canonical Studio manifest on success. */
|
|
33
21
|
const save = useCallback(async () => {
|
|
22
|
+
if (busy)
|
|
23
|
+
return;
|
|
34
24
|
setBusy(true);
|
|
35
25
|
setMessage(null);
|
|
36
26
|
try {
|
|
@@ -46,16 +36,30 @@ export function ManualRestApiCard() {
|
|
|
46
36
|
setResult(next);
|
|
47
37
|
if (next.ok) {
|
|
48
38
|
await studio.refetchManifest();
|
|
49
|
-
|
|
39
|
+
onSaved(next.apiId);
|
|
40
|
+
return;
|
|
50
41
|
}
|
|
42
|
+
setMessage(next.diagnostics[0]?.message ?? 'Manual REST API creation failed.');
|
|
51
43
|
}
|
|
52
44
|
catch (error) {
|
|
45
|
+
setResult(null);
|
|
53
46
|
setMessage(error instanceof Error ? error.message : 'Manual REST API creation failed.');
|
|
54
47
|
}
|
|
55
48
|
finally {
|
|
56
49
|
setBusy(false);
|
|
57
50
|
}
|
|
58
|
-
}, [apiId, baseUrl, endpointId, intent, method, operationId, path, studio]);
|
|
59
|
-
return (_jsx(Card, { title: "Manual
|
|
51
|
+
}, [apiId, baseUrl, busy, endpointId, intent, method, onSaved, operationId, path, studio]);
|
|
52
|
+
return (_jsx(Card, { title: "Manual REST fallback", description: "Automatic discovery did not find a supported definition. Describe the first REST operation without creating another API model.", children: _jsxs(View, { style: externalApiAdminStyles.stack, children: [_jsx(Text, { color: "neutral", emphasis: "muted", variant: "bodySmall", children: "Studio will persist this through the same canonical infra.apis entry. Retry discovery at any time without losing the URL above." }), _jsx(ExternalApiField, { label: "Generated API ID", children: _jsx(Text, { selectable: true, variant: "bodySmall", children: apiId }) }), _jsx(ExternalApiField, { label: "Base URL", children: _jsx(TextInput, { accessibilityLabel: "Manual REST base URL", value: baseUrl, autoCapitalize: "none", autoCorrect: false, onChangeText: setBaseUrl }) }), _jsxs(View, { style: externalApiAdminStyles.columns, children: [_jsx(ExternalApiField, { label: "Endpoint ID", children: _jsx(TextInput, { accessibilityLabel: "Endpoint ID", value: endpointId, autoCapitalize: "none", onChangeText: setEndpointId }) }), _jsx(ExternalApiField, { label: "Path", children: _jsx(TextInput, { accessibilityLabel: "Endpoint path", value: path, autoCapitalize: "none", onChangeText: setPath }) }), _jsx(ExternalApiField, { label: "Operation ID", children: _jsx(TextInput, { accessibilityLabel: "Operation ID", value: operationId, autoCapitalize: "none", onChangeText: setOperationId }) })] }), _jsxs(View, { style: externalApiAdminStyles.columns, children: [_jsx(ExternalApiField, { label: "HTTP method", children: _jsx(Select, { value: method, options: METHOD_OPTIONS, onValueChange: setMethod }) }), _jsx(ExternalApiField, { label: "Intent", children: _jsx(Select, { value: intent, options: INTENT_OPTIONS, onValueChange: setIntent }) })] }), _jsxs(ButtonGroup, { orientation: "responsive", align: "end", children: [_jsx(Button, { variant: "outline", disabled: busy, onPress: onRetry, children: "Retry discovery" }), _jsx(Button, { loading: busy, disabled: busy || !baseUrl.trim() || !path.trim(), onPress: () => void save(), children: "Save REST API" })] }), _jsx(View, { accessibilityLiveRegion: "polite", children: message ? _jsx(Text, { variant: "bodySmall", children: message }) : null }), result && !result.ok ? (_jsx(ExternalApiDiagnosticList, { diagnostics: result.diagnostics, attempts: result.attempts })) : null] }) }));
|
|
60
53
|
}
|
|
54
|
+
const METHOD_OPTIONS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].map((value) => ({
|
|
55
|
+
value,
|
|
56
|
+
label: value,
|
|
57
|
+
}));
|
|
58
|
+
const INTENT_OPTIONS = [
|
|
59
|
+
{ value: 'read', label: 'Read' },
|
|
60
|
+
{ value: 'create', label: 'Create' },
|
|
61
|
+
{ value: 'update', label: 'Update' },
|
|
62
|
+
{ value: 'delete', label: 'Delete' },
|
|
63
|
+
{ value: 'action', label: 'Action' },
|
|
64
|
+
];
|
|
61
65
|
//# sourceMappingURL=ManualRestApiCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManualRestApiCard.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ManualRestApiCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"ManualRestApiCard.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ManualRestApiCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AAStC,gIAAgI;AAChI,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,EACZ,OAAO,EACP,OAAO,GACgB;IACvB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAsB,MAAM,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IAC5E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExC,sGAAsG;IACtG,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAClC,IAAI,IAAI;YAAE,OAAO;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,SAAS,EAAE;gBACvD,KAAK;gBACL,OAAO;gBACP,UAAU;gBACV,IAAI;gBACJ,WAAW;gBACX,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,kCAAkC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC;QAC1F,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3F,OAAO,CACL,KAAC,IAAI,IACH,KAAK,EAAC,sBAAsB,EAC5B,WAAW,EAAC,gIAAgI,YAE5I,MAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,KAAK,aACvC,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,WAAW,gJAGnD,EACP,KAAC,gBAAgB,IAAC,KAAK,EAAC,kBAAkB,YACxC,KAAC,IAAI,IAAC,UAAU,QAAC,OAAO,EAAC,WAAW,YACjC,KAAK,GACD,GACU,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,UAAU,YAChC,KAAC,SAAS,IACR,kBAAkB,EAAC,sBAAsB,EACzC,KAAK,EAAE,OAAO,EACd,cAAc,EAAC,MAAM,EACrB,WAAW,EAAE,KAAK,EAClB,YAAY,EAAE,UAAU,GACxB,GACe,EACnB,MAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,OAAO,aACzC,KAAC,gBAAgB,IAAC,KAAK,EAAC,aAAa,YACnC,KAAC,SAAS,IACR,kBAAkB,EAAC,aAAa,EAChC,KAAK,EAAE,UAAU,EACjB,cAAc,EAAC,MAAM,EACrB,YAAY,EAAE,aAAa,GAC3B,GACe,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,MAAM,YAC5B,KAAC,SAAS,IACR,kBAAkB,EAAC,eAAe,EAClC,KAAK,EAAE,IAAI,EACX,cAAc,EAAC,MAAM,EACrB,YAAY,EAAE,OAAO,GACrB,GACe,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,cAAc,YACpC,KAAC,SAAS,IACR,kBAAkB,EAAC,cAAc,EACjC,KAAK,EAAE,WAAW,EAClB,cAAc,EAAC,MAAM,EACrB,YAAY,EAAE,cAAc,GAC5B,GACe,IACd,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,OAAO,aACzC,KAAC,gBAAgB,IAAC,KAAK,EAAC,aAAa,YACnC,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,GAAI,GAC3D,EACnB,KAAC,gBAAgB,IAAC,KAAK,EAAC,QAAQ,YAC9B,KAAC,MAAM,IAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,GAAI,GAC3D,IACd,EACP,MAAC,WAAW,IAAC,WAAW,EAAC,YAAY,EAAC,KAAK,EAAC,KAAK,aAC/C,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,gCAEjD,EACT,KAAC,MAAM,IACL,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EACjD,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,8BAGnB,IACG,EACd,KAAC,IAAI,IAAC,uBAAuB,EAAC,QAAQ,YACnC,OAAO,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,OAAO,EAAC,WAAW,YAAE,OAAO,GAAQ,CAAC,CAAC,CAAC,IAAI,GACvD,EACN,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CACtB,KAAC,yBAAyB,IAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAI,CAC1F,CAAC,CAAC,CAAC,IAAI,IACH,GACF,CACR,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/E,KAAK;IACL,KAAK,EAAE,KAAK;CACb,CAAC,CAAC,CAAC;AAEJ,MAAM,cAAc,GAA6D;IAC/E,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAChC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;CACrC,CAAC"}
|