@ankhorage/studio 0.11.12 → 0.12.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.
Files changed (89) hide show
  1. package/README.md +1 -1
  2. package/dist/externalApiApi.d.ts +5 -0
  3. package/dist/externalApiApi.d.ts.map +1 -0
  4. package/dist/externalApiApi.js +173 -0
  5. package/dist/externalApiApi.js.map +1 -0
  6. package/dist/externalApiAuthoring.d.ts +4 -0
  7. package/dist/externalApiAuthoring.d.ts.map +1 -0
  8. package/dist/externalApiAuthoring.js +3 -0
  9. package/dist/externalApiAuthoring.js.map +1 -0
  10. package/dist/externalApiAuthoringContracts.d.ts +70 -0
  11. package/dist/externalApiAuthoringContracts.d.ts.map +1 -0
  12. package/dist/externalApiAuthoringContracts.js +2 -0
  13. package/dist/externalApiAuthoringContracts.js.map +1 -0
  14. package/dist/host/dataSources/createProjectEndpointCredentialResolver.d.ts +8 -0
  15. package/dist/host/dataSources/createProjectEndpointCredentialResolver.d.ts.map +1 -0
  16. package/dist/host/dataSources/createProjectEndpointCredentialResolver.js +43 -0
  17. package/dist/host/dataSources/createProjectEndpointCredentialResolver.js.map +1 -0
  18. package/dist/host/dataSources/createTrustedEndpointTestFetch.d.ts +3 -0
  19. package/dist/host/dataSources/createTrustedEndpointTestFetch.d.ts.map +1 -0
  20. package/dist/host/dataSources/createTrustedEndpointTestFetch.js +5 -0
  21. package/dist/host/dataSources/createTrustedEndpointTestFetch.js.map +1 -0
  22. package/dist/host/dataSources/createTrustedExternalApiFetch.d.ts +3 -0
  23. package/dist/host/dataSources/createTrustedExternalApiFetch.d.ts.map +1 -0
  24. package/dist/host/dataSources/createTrustedExternalApiFetch.js +5 -0
  25. package/dist/host/dataSources/createTrustedExternalApiFetch.js.map +1 -0
  26. package/dist/host/dataSources/requestTrustedExternalApi.d.ts +12 -0
  27. package/dist/host/dataSources/requestTrustedExternalApi.d.ts.map +1 -0
  28. package/dist/host/dataSources/requestTrustedExternalApi.js +44 -0
  29. package/dist/host/dataSources/requestTrustedExternalApi.js.map +1 -0
  30. package/dist/host/dataSources/sanitizeExternalApiOperationTestResult.d.ts +4 -0
  31. package/dist/host/dataSources/sanitizeExternalApiOperationTestResult.d.ts.map +1 -0
  32. package/dist/host/dataSources/sanitizeExternalApiOperationTestResult.js +34 -0
  33. package/dist/host/dataSources/sanitizeExternalApiOperationTestResult.js.map +1 -0
  34. package/dist/host/dataSources/studioExternalApiService.d.ts +24 -0
  35. package/dist/host/dataSources/studioExternalApiService.d.ts.map +1 -0
  36. package/dist/host/dataSources/studioExternalApiService.js +163 -0
  37. package/dist/host/dataSources/studioExternalApiService.js.map +1 -0
  38. package/dist/host/http/dataSourceRoutes.d.ts +9 -0
  39. package/dist/host/http/dataSourceRoutes.d.ts.map +1 -0
  40. package/dist/host/http/dataSourceRoutes.js +147 -0
  41. package/dist/host/http/dataSourceRoutes.js.map +1 -0
  42. package/dist/host/http/serverWithSecrets.d.ts +1 -1
  43. package/dist/host/http/serverWithSecrets.d.ts.map +1 -1
  44. package/dist/host/http/serverWithSecrets.js +4 -5
  45. package/dist/host/http/serverWithSecrets.js.map +1 -1
  46. package/dist/host/index.d.ts +4 -0
  47. package/dist/host/index.d.ts.map +1 -1
  48. package/dist/host/index.js +4 -0
  49. package/dist/host/index.js.map +1 -1
  50. package/dist/normalizeExternalApiSourceId.d.ts +9 -0
  51. package/dist/normalizeExternalApiSourceId.d.ts.map +1 -0
  52. package/dist/normalizeExternalApiSourceId.js +12 -0
  53. package/dist/normalizeExternalApiSourceId.js.map +1 -0
  54. package/dist/ui/admin/pages/ApisAdminPage.d.ts.map +1 -1
  55. package/dist/ui/admin/pages/ApisAdminPage.js +8 -8
  56. package/dist/ui/admin/pages/ApisAdminPage.js.map +1 -1
  57. package/dist/ui/admin/pages/DataSourceCatalogCard.d.ts +5 -0
  58. package/dist/ui/admin/pages/DataSourceCatalogCard.d.ts.map +1 -0
  59. package/dist/ui/admin/pages/DataSourceCatalogCard.js +19 -0
  60. package/dist/ui/admin/pages/DataSourceCatalogCard.js.map +1 -0
  61. package/dist/ui/admin/pages/DataSourceOperationsCard.d.ts +5 -0
  62. package/dist/ui/admin/pages/DataSourceOperationsCard.d.ts.map +1 -0
  63. package/dist/ui/admin/pages/DataSourceOperationsCard.js +46 -0
  64. package/dist/ui/admin/pages/DataSourceOperationsCard.js.map +1 -0
  65. package/dist/ui/admin/pages/ExternalApiAdminPrimitives.d.ts +43 -0
  66. package/dist/ui/admin/pages/ExternalApiAdminPrimitives.d.ts.map +1 -0
  67. package/dist/ui/admin/pages/ExternalApiAdminPrimitives.js +43 -0
  68. package/dist/ui/admin/pages/ExternalApiAdminPrimitives.js.map +1 -0
  69. package/dist/ui/admin/pages/ExternalApiConnectCard.d.ts +2 -0
  70. package/dist/ui/admin/pages/ExternalApiConnectCard.d.ts.map +1 -0
  71. package/dist/ui/admin/pages/ExternalApiConnectCard.js +57 -0
  72. package/dist/ui/admin/pages/ExternalApiConnectCard.js.map +1 -0
  73. package/dist/ui/admin/pages/ManualRestSourceCard.d.ts +2 -0
  74. package/dist/ui/admin/pages/ManualRestSourceCard.d.ts.map +1 -0
  75. package/dist/ui/admin/pages/ManualRestSourceCard.js +59 -0
  76. package/dist/ui/admin/pages/ManualRestSourceCard.js.map +1 -0
  77. package/dist/ui/admin/pages/adminDataSourceOperations.d.ts +4 -1
  78. package/dist/ui/admin/pages/adminDataSourceOperations.d.ts.map +1 -1
  79. package/dist/ui/admin/pages/adminDataSourceOperations.js +6 -4
  80. package/dist/ui/admin/pages/adminDataSourceOperations.js.map +1 -1
  81. package/dist/upsertExternalApiDataSource.d.ts +7 -0
  82. package/dist/upsertExternalApiDataSource.d.ts.map +1 -0
  83. package/dist/upsertExternalApiDataSource.js +7 -0
  84. package/dist/upsertExternalApiDataSource.js.map +1 -0
  85. package/package.json +9 -2
  86. package/dist/ui/admin/adminPageUtils.d.ts +0 -3
  87. package/dist/ui/admin/adminPageUtils.d.ts.map +0 -1
  88. package/dist/ui/admin/adminPageUtils.js +0 -7
  89. package/dist/ui/admin/adminPageUtils.js.map +0 -1
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # @ankhorage/studio
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.11.11](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v0.11.12](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Standalone Studio authoring package for Ankhorage apps.
9
9
 
@@ -0,0 +1,5 @@
1
+ import type { ExternalApiConnectRequest, ExternalApiConnectResult, ExternalApiOperationTestRequest, ExternalApiOperationTestResult, ManualRestSourceRequest } from './externalApiAuthoringContracts';
2
+ export declare function connectExternalApi(projectId: string, request: ExternalApiConnectRequest): Promise<ExternalApiConnectResult>;
3
+ export declare function createManualRestSource(projectId: string, request: ManualRestSourceRequest): Promise<ExternalApiConnectResult>;
4
+ export declare function testExternalApiOperation(projectId: string, request: ExternalApiOperationTestRequest): Promise<ExternalApiOperationTestResult>;
5
+ //# sourceMappingURL=externalApiApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalApiApi.d.ts","sourceRoot":"","sources":["../src/externalApiApi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EAExB,+BAA+B,EAC/B,8BAA8B,EAC9B,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AAYzC,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAEnC;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,wBAAwB,CAAC,CAEnC;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC,CAEzC"}
@@ -0,0 +1,173 @@
1
+ import { API_BASE } from './core/constants';
2
+ class ExternalApiApiError extends Error {
3
+ status;
4
+ constructor(message, status) {
5
+ super(message);
6
+ this.name = 'ExternalApiApiError';
7
+ this.status = status;
8
+ }
9
+ }
10
+ export function connectExternalApi(projectId, request) {
11
+ return requestResult(projectId, 'connect', request, parseConnectResult);
12
+ }
13
+ export function createManualRestSource(projectId, request) {
14
+ return requestResult(projectId, 'manual-rest', request, parseConnectResult);
15
+ }
16
+ export function testExternalApiOperation(projectId, request) {
17
+ return requestResult(projectId, 'test', request, parseTestResult);
18
+ }
19
+ async function requestResult(projectId, action, body, parse) {
20
+ const response = await fetch(`${API_BASE}/projects/${encodeURIComponent(projectId)}/data-sources/${action}`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify(body),
24
+ });
25
+ const value = await readJson(response);
26
+ if (!response.ok && !isStructuredFailure(value)) {
27
+ throw new ExternalApiApiError('The Studio external API request failed.', response.status);
28
+ }
29
+ return parse(value);
30
+ }
31
+ async function readJson(response) {
32
+ try {
33
+ return await response.json();
34
+ }
35
+ catch {
36
+ throw new ExternalApiApiError('The Studio host returned a non-JSON response.', response.status);
37
+ }
38
+ }
39
+ function parseConnectResult(value) {
40
+ const record = requireResultRecord(value);
41
+ const diagnostics = parseDiagnostics(record.diagnostics);
42
+ const attempts = parseAttempts(record.attempts);
43
+ if (!record.ok)
44
+ return { ok: false, diagnostics, attempts };
45
+ if (typeof record.sourceId !== 'string' ||
46
+ !isDataSourceKind(record.kind) ||
47
+ !isConnectedProtocol(record.protocol) ||
48
+ typeof record.created !== 'boolean') {
49
+ throw invalidResponse();
50
+ }
51
+ return {
52
+ ok: true,
53
+ sourceId: record.sourceId,
54
+ kind: record.kind,
55
+ protocol: record.protocol,
56
+ created: record.created,
57
+ diagnostics,
58
+ attempts,
59
+ };
60
+ }
61
+ function parseTestResult(value) {
62
+ const record = requireResultRecord(value);
63
+ const diagnostics = parseDiagnostics(record.diagnostics);
64
+ const request = parseRequestSummary(record.request);
65
+ const response = parseResponseSummary(record.response);
66
+ if (!record.ok)
67
+ return { ok: false, request, response, diagnostics };
68
+ if (!request)
69
+ throw invalidResponse();
70
+ const data = isDataContractValue(record.data) ? record.data : undefined;
71
+ return { ok: true, request, response, data, diagnostics };
72
+ }
73
+ function requireResultRecord(value) {
74
+ const record = readRecord(value);
75
+ if (!record || typeof record.ok !== 'boolean')
76
+ throw invalidResponse();
77
+ return { ...record, ok: record.ok };
78
+ }
79
+ function parseDiagnostics(value) {
80
+ if (!Array.isArray(value))
81
+ throw invalidResponse();
82
+ return value.map((entry) => {
83
+ const record = readRecord(entry);
84
+ if (!record ||
85
+ typeof record.code !== 'string' ||
86
+ typeof record.message !== 'string' ||
87
+ !isSeverity(record.severity)) {
88
+ throw invalidResponse();
89
+ }
90
+ return {
91
+ code: record.code,
92
+ message: record.message,
93
+ severity: record.severity,
94
+ dataSourceId: readString(record.dataSourceId),
95
+ endpointId: readString(record.endpointId),
96
+ operationId: readString(record.operationId),
97
+ path: readString(record.path),
98
+ hint: readString(record.hint),
99
+ };
100
+ });
101
+ }
102
+ function parseAttempts(value) {
103
+ if (!Array.isArray(value))
104
+ throw invalidResponse();
105
+ return value.map((entry) => {
106
+ const record = readRecord(entry);
107
+ if (!record || typeof record.url !== 'string' || typeof record.outcome !== 'string') {
108
+ throw invalidResponse();
109
+ }
110
+ return {
111
+ url: record.url,
112
+ outcome: record.outcome,
113
+ status: typeof record.status === 'number' ? record.status : undefined,
114
+ };
115
+ });
116
+ }
117
+ function parseRequestSummary(value) {
118
+ if (value === undefined)
119
+ return undefined;
120
+ const record = readRecord(value);
121
+ if (!record ||
122
+ typeof record.method !== 'string' ||
123
+ typeof record.url !== 'string' ||
124
+ typeof record.dryRun !== 'boolean') {
125
+ throw invalidResponse();
126
+ }
127
+ return { method: record.method, url: record.url, dryRun: record.dryRun };
128
+ }
129
+ function parseResponseSummary(value) {
130
+ if (value === undefined)
131
+ return undefined;
132
+ const record = readRecord(value);
133
+ if (!record || typeof record.status !== 'number' || typeof record.ok !== 'boolean') {
134
+ throw invalidResponse();
135
+ }
136
+ return { status: record.status, ok: record.ok };
137
+ }
138
+ function isStructuredFailure(value) {
139
+ return readRecord(value)?.ok === false;
140
+ }
141
+ function isConnectedProtocol(value) {
142
+ return value === 'graphql' || value === 'openapi' || value === 'rest';
143
+ }
144
+ function isDataSourceKind(value) {
145
+ return (value === 'database' ||
146
+ value === 'graphql' ||
147
+ value === 'managed-api' ||
148
+ value === 'openapi' ||
149
+ value === 'rest');
150
+ }
151
+ function isSeverity(value) {
152
+ return value === 'error' || value === 'info' || value === 'warning';
153
+ }
154
+ function isDataContractValue(value) {
155
+ if (value === null || ['boolean', 'number', 'string'].includes(typeof value))
156
+ return true;
157
+ if (Array.isArray(value))
158
+ return value.every(isDataContractValue);
159
+ const record = readRecord(value);
160
+ return record !== null && Object.values(record).every(isDataContractValue);
161
+ }
162
+ function readRecord(value) {
163
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
164
+ ? value
165
+ : null;
166
+ }
167
+ function readString(value) {
168
+ return typeof value === 'string' ? value : undefined;
169
+ }
170
+ function invalidResponse() {
171
+ return new ExternalApiApiError('The Studio host returned an invalid external API response.', 502);
172
+ }
173
+ //# sourceMappingURL=externalApiApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalApiApi.js","sourceRoot":"","sources":["../src/externalApiApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { ExternalApiConnectRequest, ExternalApiConnectResult, ExternalApiDiscoveryAttempt, ExternalApiOperationTestRequest, ExternalApiOperationTestResult, ExternalApiProtocol, ManualRestSourceRequest, } from './externalApiAuthoringContracts';
2
+ export { type ExternalApiSourceIdResult, normalizeExternalApiSourceId, } from './normalizeExternalApiSourceId';
3
+ export { type ExternalApiDataSourceUpsertResult, upsertExternalApiDataSource, } from './upsertExternalApiDataSource';
4
+ //# sourceMappingURL=externalApiAuthoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalApiAuthoring.d.ts","sourceRoot":"","sources":["../src/externalApiAuthoring.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,+BAA+B,EAC/B,8BAA8B,EAC9B,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,yBAAyB,EAC9B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,KAAK,iCAAiC,EACtC,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { normalizeExternalApiSourceId, } from './normalizeExternalApiSourceId';
2
+ export { upsertExternalApiDataSource, } from './upsertExternalApiDataSource';
3
+ //# sourceMappingURL=externalApiAuthoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalApiAuthoring.js","sourceRoot":"","sources":["../src/externalApiAuthoring.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { CredentialRef, DataContractValue, DataOperationIntent, DataSourceDiagnostic, DataSourceKind } from '@ankhorage/contracts/data';
2
+ export type ExternalApiProtocol = 'auto' | 'graphql' | 'openapi';
3
+ export interface ExternalApiConnectRequest {
4
+ readonly sourceId: string;
5
+ readonly url: string;
6
+ readonly protocol: ExternalApiProtocol;
7
+ readonly name?: string;
8
+ readonly description?: string;
9
+ readonly credential?: CredentialRef;
10
+ }
11
+ export interface ManualRestSourceRequest {
12
+ readonly sourceId: string;
13
+ readonly baseUrl: string;
14
+ readonly endpointId: string;
15
+ readonly path: string;
16
+ readonly operationId: string;
17
+ readonly method: string;
18
+ readonly intent: DataOperationIntent;
19
+ readonly name?: string;
20
+ readonly description?: string;
21
+ readonly credential?: CredentialRef;
22
+ }
23
+ export interface ExternalApiDiscoveryAttempt {
24
+ readonly url: string;
25
+ readonly outcome: string;
26
+ readonly status?: number;
27
+ }
28
+ export type ExternalApiConnectResult = {
29
+ readonly ok: true;
30
+ readonly sourceId: string;
31
+ readonly kind: DataSourceKind;
32
+ readonly protocol: 'graphql' | 'openapi' | 'rest';
33
+ readonly created: boolean;
34
+ readonly attempts: readonly ExternalApiDiscoveryAttempt[];
35
+ readonly diagnostics: readonly DataSourceDiagnostic[];
36
+ } | {
37
+ readonly ok: false;
38
+ readonly attempts: readonly ExternalApiDiscoveryAttempt[];
39
+ readonly diagnostics: readonly DataSourceDiagnostic[];
40
+ };
41
+ export interface ExternalApiOperationTestRequest {
42
+ readonly sourceId: string;
43
+ readonly endpointId: string;
44
+ readonly operationId: string;
45
+ readonly values?: Readonly<Record<string, DataContractValue>>;
46
+ readonly dryRun?: boolean;
47
+ }
48
+ interface ExternalApiSafeRequestSummary {
49
+ readonly method: string;
50
+ readonly url: string;
51
+ readonly dryRun: boolean;
52
+ }
53
+ interface ExternalApiSafeResponseSummary {
54
+ readonly status: number;
55
+ readonly ok: boolean;
56
+ }
57
+ export type ExternalApiOperationTestResult = {
58
+ readonly ok: true;
59
+ readonly request: ExternalApiSafeRequestSummary;
60
+ readonly response?: ExternalApiSafeResponseSummary;
61
+ readonly data?: DataContractValue;
62
+ readonly diagnostics: readonly DataSourceDiagnostic[];
63
+ } | {
64
+ readonly ok: false;
65
+ readonly request?: ExternalApiSafeRequestSummary;
66
+ readonly response?: ExternalApiSafeResponseSummary;
67
+ readonly diagnostics: readonly DataSourceDiagnostic[];
68
+ };
69
+ export {};
70
+ //# sourceMappingURL=externalApiAuthoringContracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalApiAuthoringContracts.d.ts","sourceRoot":"","sources":["../src/externalApiAuthoringContracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=externalApiAuthoringContracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalApiAuthoringContracts.js","sourceRoot":"","sources":["../src/externalApiAuthoringContracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { EndpointTestCredentialResolver } from '@ankhorage/data-sources';
2
+ import type { ProjectSecretService } from '../secrets/projectSecretService';
3
+ export declare function createProjectEndpointCredentialResolver(args: {
4
+ readonly projectId: string;
5
+ readonly service: Pick<ProjectSecretService, 'resolve'>;
6
+ readonly environment?: string;
7
+ }): EndpointTestCredentialResolver;
8
+ //# sourceMappingURL=createProjectEndpointCredentialResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProjectEndpointCredentialResolver.d.ts","sourceRoot":"","sources":["../../../src/host/dataSources/createProjectEndpointCredentialResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,wBAAgB,uCAAuC,CAAC,IAAI,EAAE;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,8BAA8B,CASjC"}
@@ -0,0 +1,43 @@
1
+ export function createProjectEndpointCredentialResolver(args) {
2
+ return async (credential) => {
3
+ const result = await args.service.resolve({
4
+ projectId: args.projectId,
5
+ environment: args.environment,
6
+ ref: credential.id,
7
+ });
8
+ return result.ok ? mapCredential(credential, result.data) : undefined;
9
+ };
10
+ }
11
+ function mapCredential(credential, payload) {
12
+ if (credential.kind === 'bearer' || credential.kind === 'oauth2') {
13
+ const token = payload.token ?? payload.accessToken ?? payload.value;
14
+ return token ? { headers: { authorization: `Bearer ${token}` } } : undefined;
15
+ }
16
+ if (credential.kind === 'basic') {
17
+ const { username, password } = payload;
18
+ return username && password
19
+ ? {
20
+ headers: {
21
+ authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`,
22
+ },
23
+ }
24
+ : undefined;
25
+ }
26
+ return mapScopedValueCredential(credential, payload);
27
+ }
28
+ function mapScopedValueCredential(credential, payload) {
29
+ const separator = credential.scope?.indexOf(':') ?? -1;
30
+ if (separator < 1)
31
+ return undefined;
32
+ const location = credential.scope?.slice(0, separator);
33
+ const name = credential.scope?.slice(separator + 1).trim();
34
+ const value = payload.value ?? payload.token ?? Object.values(payload)[0];
35
+ if (!name || !value)
36
+ return undefined;
37
+ if (location === 'header')
38
+ return { headers: { [name]: value } };
39
+ if (location === 'query')
40
+ return { query: { [name]: value } };
41
+ return undefined;
42
+ }
43
+ //# sourceMappingURL=createProjectEndpointCredentialResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createProjectEndpointCredentialResolver.js","sourceRoot":"","sources":["../../../src/host/dataSources/createProjectEndpointCredentialResolver.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,uCAAuC,CAAC,IAIvD;IACC,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACxC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,EAAE,UAAU,CAAC,EAAE;SACnB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,UAAyB,EACzB,OAAsB;IAEtB,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;QACpE,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACvC,OAAO,QAAQ,IAAI,QAAQ;YACzB,CAAC,CAAC;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;iBACpF;aACF;YACH,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IACD,OAAO,wBAAwB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,wBAAwB,CAC/B,UAAyB,EACzB,OAAsB;IAEtB,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;IACjE,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;IAC9D,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EndpointTestFetch } from '@ankhorage/data-sources';
2
+ export declare function createTrustedEndpointTestFetch(): EndpointTestFetch;
3
+ //# sourceMappingURL=createTrustedEndpointTestFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTrustedEndpointTestFetch.d.ts","sourceRoot":"","sources":["../../../src/host/dataSources/createTrustedEndpointTestFetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,wBAAgB,8BAA8B,IAAI,iBAAiB,CAElE"}
@@ -0,0 +1,5 @@
1
+ import { requestTrustedExternalApi } from './requestTrustedExternalApi';
2
+ export function createTrustedEndpointTestFetch() {
3
+ return (url, init) => requestTrustedExternalApi(url, init);
4
+ }
5
+ //# sourceMappingURL=createTrustedEndpointTestFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTrustedEndpointTestFetch.js","sourceRoot":"","sources":["../../../src/host/dataSources/createTrustedEndpointTestFetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,UAAU,8BAA8B;IAC5C,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ExternalApiFetch } from '@ankhorage/data-sources';
2
+ export declare function createTrustedExternalApiFetch(): ExternalApiFetch;
3
+ //# sourceMappingURL=createTrustedExternalApiFetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTrustedExternalApiFetch.d.ts","sourceRoot":"","sources":["../../../src/host/dataSources/createTrustedExternalApiFetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,wBAAgB,6BAA6B,IAAI,gBAAgB,CAEhE"}
@@ -0,0 +1,5 @@
1
+ import { requestTrustedExternalApi } from './requestTrustedExternalApi';
2
+ export function createTrustedExternalApiFetch() {
3
+ return (url, init) => requestTrustedExternalApi(url, init);
4
+ }
5
+ //# sourceMappingURL=createTrustedExternalApiFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTrustedExternalApiFetch.js","sourceRoot":"","sources":["../../../src/host/dataSources/createTrustedExternalApiFetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,UAAU,6BAA6B;IAC3C,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function requestTrustedExternalApi(rawUrl: string, init: {
2
+ readonly method: string;
3
+ readonly headers: Readonly<Record<string, string>>;
4
+ readonly body?: string;
5
+ }, options?: {
6
+ readonly timeoutMs?: number;
7
+ readonly maxResponseBytes?: number;
8
+ }): Promise<{
9
+ readonly status: number;
10
+ text(): Promise<string>;
11
+ }>;
12
+ //# sourceMappingURL=requestTrustedExternalApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestTrustedExternalApi.d.ts","sourceRoot":"","sources":["../../../src/host/dataSources/requestTrustedExternalApi.ts"],"names":[],"mappings":"AASA,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,EACD,OAAO,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAChF,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CAa/D"}
@@ -0,0 +1,44 @@
1
+ const DEFAULT_TIMEOUT_MS = 10_000;
2
+ const DEFAULT_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
3
+ const BLOCKED_HOSTNAMES = new Set([
4
+ '100.100.100.200',
5
+ '169.254.169.254',
6
+ '[fd00:ec2::254]',
7
+ 'metadata.google.internal',
8
+ ]);
9
+ export async function requestTrustedExternalApi(rawUrl, init, options = {}) {
10
+ const url = parseTrustedUrl(rawUrl);
11
+ const response = await fetch(url, {
12
+ method: init.method,
13
+ headers: init.headers,
14
+ body: init.body,
15
+ credentials: 'omit',
16
+ redirect: 'error',
17
+ signal: AbortSignal.timeout(options.timeoutMs ?? DEFAULT_TIMEOUT_MS),
18
+ });
19
+ const maxBytes = options.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;
20
+ const textPromise = readLimitedResponseText(response, maxBytes);
21
+ return { status: response.status, text: () => textPromise };
22
+ }
23
+ function parseTrustedUrl(rawUrl) {
24
+ const url = new URL(rawUrl);
25
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
26
+ throw new Error('External API transport supports HTTP and HTTPS only.');
27
+ }
28
+ if (url.username || url.password || BLOCKED_HOSTNAMES.has(url.hostname.toLowerCase())) {
29
+ throw new Error('External API target is blocked by the trusted transport policy.');
30
+ }
31
+ return url;
32
+ }
33
+ async function readLimitedResponseText(response, maxBytes) {
34
+ const contentLength = Number(response.headers.get('content-length'));
35
+ if (Number.isFinite(contentLength) && contentLength > maxBytes) {
36
+ throw new Error('External API response exceeds the configured size limit.');
37
+ }
38
+ const bytes = await response.arrayBuffer();
39
+ if (bytes.byteLength > maxBytes) {
40
+ throw new Error('External API response exceeds the configured size limit.');
41
+ }
42
+ return new TextDecoder().decode(bytes);
43
+ }
44
+ //# sourceMappingURL=requestTrustedExternalApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestTrustedExternalApi.js","sourceRoot":"","sources":["../../../src/host/dataSources/requestTrustedExternalApi.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,0BAA0B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACnD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,0BAA0B;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAc,EACd,IAIC,EACD,UAA+E,EAAE;IAEjF,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,MAAM;QACnB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;KACrE,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IACxE,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAkB,EAAE,QAAgB;IACzE,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,QAAQ,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,KAAK,CAAC,UAAU,GAAG,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EndpointTestResult } from '@ankhorage/data-sources';
2
+ import type { ExternalApiOperationTestResult } from '../../externalApiAuthoringContracts';
3
+ export declare function sanitizeExternalApiOperationTestResult(result: EndpointTestResult): ExternalApiOperationTestResult;
4
+ //# sourceMappingURL=sanitizeExternalApiOperationTestResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeExternalApiOperationTestResult.d.ts","sourceRoot":"","sources":["../../../src/host/dataSources/sanitizeExternalApiOperationTestResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAE1F,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,kBAAkB,GACzB,8BAA8B,CAqBhC"}
@@ -0,0 +1,34 @@
1
+ export function sanitizeExternalApiOperationTestResult(result) {
2
+ const request = result.request
3
+ ? {
4
+ method: result.request.method,
5
+ url: redactQueryValues(result.request.url),
6
+ dryRun: result.request.dryRun,
7
+ }
8
+ : undefined;
9
+ const response = result.response
10
+ ? { status: result.response.status, ok: result.response.ok }
11
+ : undefined;
12
+ return result.ok
13
+ ? {
14
+ ok: true,
15
+ request: request ?? { method: 'UNKNOWN', url: '', dryRun: false },
16
+ response,
17
+ data: result.data,
18
+ diagnostics: result.diagnostics,
19
+ }
20
+ : { ok: false, request, response, diagnostics: result.diagnostics };
21
+ }
22
+ function redactQueryValues(rawUrl) {
23
+ try {
24
+ const url = new URL(rawUrl);
25
+ for (const key of [...url.searchParams.keys()]) {
26
+ url.searchParams.set(key, '[redacted]');
27
+ }
28
+ return url.toString();
29
+ }
30
+ catch {
31
+ return rawUrl.split('?')[0] ?? rawUrl;
32
+ }
33
+ }
34
+ //# sourceMappingURL=sanitizeExternalApiOperationTestResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeExternalApiOperationTestResult.js","sourceRoot":"","sources":["../../../src/host/dataSources/sanitizeExternalApiOperationTestResult.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sCAAsC,CACpD,MAA0B;IAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;QAC5B,CAAC,CAAC;YACE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YAC7B,GAAG,EAAE,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;YAC1C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;SAC9B;QACH,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAC9B,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,MAAM,CAAC,EAAE;QACd,CAAC,CAAC;YACE,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,OAAO,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;YACjE,QAAQ;YACR,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC;QACH,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type EndpointTestFetch, type ExternalApiFetch } from '@ankhorage/data-sources';
2
+ import type { ExternalApiConnectRequest, ExternalApiConnectResult, ExternalApiOperationTestRequest, ExternalApiOperationTestResult, ManualRestSourceRequest } from '../../externalApiAuthoringContracts';
3
+ import type { ProjectManager } from '../orchestrator/projectManager';
4
+ import type { ProjectSecretService } from '../secrets/projectSecretService';
5
+ export declare class StudioExternalApiService {
6
+ private readonly projectManager;
7
+ private readonly discoveryFetch;
8
+ private readonly endpointFetch;
9
+ private readonly secretService?;
10
+ constructor(options: {
11
+ readonly projectManager: Pick<ProjectManager, 'getProjectManifest' | 'getStudioManifest' | 'saveStudioManifest'>;
12
+ readonly discoveryFetch?: ExternalApiFetch;
13
+ readonly endpointFetch?: EndpointTestFetch;
14
+ readonly secretService?: Pick<ProjectSecretService, 'resolve'>;
15
+ });
16
+ connect(projectId: string, request: ExternalApiConnectRequest): Promise<ExternalApiConnectResult>;
17
+ createManualRest(projectId: string, request: ManualRestSourceRequest): Promise<ExternalApiConnectResult>;
18
+ testOperation(projectId: string, request: ExternalApiOperationTestRequest): Promise<ExternalApiOperationTestResult>;
19
+ private discoverOpenApi;
20
+ private connectGraphQl;
21
+ private persist;
22
+ private readEditableManifest;
23
+ }
24
+ //# sourceMappingURL=studioExternalApiService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studioExternalApiService.d.ts","sourceRoot":"","sources":["../../../src/host/dataSources/studioExternalApiService.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAGtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACxB,+BAA+B,EAC/B,8BAA8B,EAC9B,uBAAuB,EACxB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAY5E,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAwC;gBAE3D,OAAO,EAAE;QACnB,QAAQ,CAAC,cAAc,EAAE,IAAI,CAC3B,cAAc,EACd,oBAAoB,GAAG,mBAAmB,GAAG,oBAAoB,CAClE,CAAC;QACF,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;QAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;KAChE;IAOK,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC;IAY9B,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,wBAAwB,CAAC;IA6B9B,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC;IAsB1C,OAAO,CAAC,eAAe;YAWT,cAAc;YAuBd,OAAO;YAwBP,oBAAoB;CAOnC"}