@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
@@ -0,0 +1,163 @@
1
+ import { createManualRestDataSource, discoverOpenApiDataSource, introspectGraphQlDataSource, testEndpoint, } from '@ankhorage/data-sources';
2
+ import { normalizeExternalApiSourceId } from '../../normalizeExternalApiSourceId';
3
+ import { upsertExternalApiDataSource } from '../../upsertExternalApiDataSource';
4
+ import { createProjectEndpointCredentialResolver } from './createProjectEndpointCredentialResolver';
5
+ import { createTrustedEndpointTestFetch } from './createTrustedEndpointTestFetch';
6
+ import { createTrustedExternalApiFetch } from './createTrustedExternalApiFetch';
7
+ import { sanitizeExternalApiOperationTestResult } from './sanitizeExternalApiOperationTestResult';
8
+ export class StudioExternalApiService {
9
+ projectManager;
10
+ discoveryFetch;
11
+ endpointFetch;
12
+ secretService;
13
+ constructor(options) {
14
+ this.projectManager = options.projectManager;
15
+ this.discoveryFetch = options.discoveryFetch ?? createTrustedExternalApiFetch();
16
+ this.endpointFetch = options.endpointFetch ?? createTrustedEndpointTestFetch();
17
+ this.secretService = options.secretService;
18
+ }
19
+ async connect(projectId, request) {
20
+ const normalized = normalizeExternalApiSourceId(request.sourceId);
21
+ if (!normalized.ok)
22
+ return invalidResult(normalized.message);
23
+ const input = { ...request, sourceId: normalized.sourceId };
24
+ if (input.protocol === 'graphql')
25
+ return this.connectGraphQl(projectId, input, []);
26
+ const openApi = await this.discoverOpenApi(input);
27
+ if (openApi.ok)
28
+ return this.persist(projectId, openApi.data, 'openapi', openApi.attempts);
29
+ if (input.protocol === 'openapi')
30
+ return openApi;
31
+ return this.connectGraphQl(projectId, input, openApi.attempts, openApi.diagnostics);
32
+ }
33
+ async createManualRest(projectId, request) {
34
+ const normalized = normalizeExternalApiSourceId(request.sourceId);
35
+ if (!normalized.ok)
36
+ return invalidResult(normalized.message);
37
+ const result = createManualRestDataSource({
38
+ id: normalized.sourceId,
39
+ baseUrl: request.baseUrl,
40
+ name: clean(request.name),
41
+ description: clean(request.description),
42
+ credential: request.credential,
43
+ endpoints: [
44
+ {
45
+ id: request.endpointId,
46
+ path: request.path,
47
+ operations: [
48
+ {
49
+ id: request.operationId,
50
+ intent: request.intent,
51
+ method: request.method,
52
+ path: request.path,
53
+ },
54
+ ],
55
+ },
56
+ ],
57
+ });
58
+ return result.ok
59
+ ? this.persist(projectId, result.data, 'rest', [], result.diagnostics ?? [])
60
+ : { ok: false, attempts: [], diagnostics: result.diagnostics };
61
+ }
62
+ async testOperation(projectId, request) {
63
+ const manifest = await this.readEditableManifest(projectId);
64
+ const source = manifest.dataSources?.[request.sourceId];
65
+ if (!source)
66
+ return missingSourceResult(request.sourceId);
67
+ const credentialResolver = this.secretService
68
+ ? createProjectEndpointCredentialResolver({
69
+ projectId,
70
+ service: this.secretService,
71
+ })
72
+ : undefined;
73
+ const result = await testEndpoint({
74
+ dataSource: source,
75
+ endpointId: request.endpointId,
76
+ operationId: request.operationId,
77
+ values: request.values,
78
+ dryRun: request.dryRun,
79
+ fetch: this.endpointFetch,
80
+ credentialResolver,
81
+ });
82
+ return sanitizeExternalApiOperationTestResult(result);
83
+ }
84
+ discoverOpenApi(request) {
85
+ return discoverOpenApiDataSource({
86
+ id: request.sourceId,
87
+ url: request.url,
88
+ fetch: this.discoveryFetch,
89
+ name: clean(request.name),
90
+ description: clean(request.description),
91
+ credential: request.credential,
92
+ });
93
+ }
94
+ async connectGraphQl(projectId, request, attempts, previousDiagnostics = []) {
95
+ const result = await introspectGraphQlDataSource({
96
+ id: request.sourceId,
97
+ endpointUrl: request.url,
98
+ fetch: this.discoveryFetch,
99
+ name: clean(request.name),
100
+ description: clean(request.description),
101
+ credential: request.credential,
102
+ });
103
+ return result.ok
104
+ ? this.persist(projectId, result.data, 'graphql', attempts, result.diagnostics)
105
+ : {
106
+ ok: false,
107
+ attempts,
108
+ diagnostics: [...previousDiagnostics, ...result.diagnostics],
109
+ };
110
+ }
111
+ async persist(projectId, source, protocol, attempts, diagnostics = []) {
112
+ const manifest = await this.readEditableManifest(projectId);
113
+ const upsert = upsertExternalApiDataSource(manifest.dataSources ?? {}, source);
114
+ await this.projectManager.saveStudioManifest({
115
+ projectId,
116
+ manifest: { ...manifest, dataSources: upsert.registry },
117
+ });
118
+ return {
119
+ ok: true,
120
+ sourceId: source.id,
121
+ kind: source.kind,
122
+ protocol,
123
+ created: upsert.created,
124
+ attempts,
125
+ diagnostics,
126
+ };
127
+ }
128
+ async readEditableManifest(projectId) {
129
+ try {
130
+ return await this.projectManager.getStudioManifest(projectId);
131
+ }
132
+ catch {
133
+ return this.projectManager.getProjectManifest(projectId);
134
+ }
135
+ }
136
+ }
137
+ function invalidResult(message) {
138
+ return {
139
+ ok: false,
140
+ attempts: [],
141
+ diagnostics: [{ code: 'invalid-config', message, severity: 'error' }],
142
+ };
143
+ }
144
+ function missingSourceResult(sourceId) {
145
+ return {
146
+ ok: false,
147
+ diagnostics: [
148
+ {
149
+ code: 'missing-data-source',
150
+ dataSourceId: sourceId,
151
+ message: `Data source '${sourceId}' could not be found.`,
152
+ severity: 'error',
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ function clean(value) {
158
+ const normalized = value?.trim();
159
+ if (!normalized)
160
+ return undefined;
161
+ return normalized;
162
+ }
163
+ //# sourceMappingURL=studioExternalApiService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studioExternalApiService.js","sourceRoot":"","sources":["../../../src/host/dataSources/studioExternalApiService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import { StudioExternalApiService } from '../dataSources/studioExternalApiService';
3
+ import type { ProjectManager } from '../orchestrator/projectManager';
4
+ export declare function registerProjectDataSourceRoutes(fastify: FastifyInstance, options: {
5
+ readonly projectManager: ProjectManager;
6
+ readonly workspaceRoot: string;
7
+ readonly service?: StudioExternalApiService;
8
+ }): void;
9
+ //# sourceMappingURL=dataSourceRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataSourceRoutes.d.ts","sourceRoot":"","sources":["../../../src/host/http/dataSourceRoutes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAO7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGrE,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE;IACP,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC;CAC7C,GACA,IAAI,CA4BN"}
@@ -0,0 +1,147 @@
1
+ import { StudioExternalApiService } from '../dataSources/studioExternalApiService';
2
+ import { ProjectSecretService } from '../secrets/projectSecretService';
3
+ export function registerProjectDataSourceRoutes(fastify, options) {
4
+ const service = options.service ??
5
+ new StudioExternalApiService({
6
+ projectManager: options.projectManager,
7
+ secretService: new ProjectSecretService({
8
+ projectManager: options.projectManager,
9
+ workspaceRoot: options.workspaceRoot,
10
+ }),
11
+ });
12
+ fastify.post('/api/projects/:id/data-sources/connect', async (request, reply) => {
13
+ const body = readConnectRequest(request.body);
14
+ if (!body)
15
+ return invalidPayload(reply, 'External API connection payload is invalid.');
16
+ return sendResult(reply, await service.connect(readProjectId(request), body));
17
+ });
18
+ fastify.post('/api/projects/:id/data-sources/manual-rest', async (request, reply) => {
19
+ const body = readManualRestRequest(request.body);
20
+ if (!body)
21
+ return invalidPayload(reply, 'Manual REST data-source payload is invalid.');
22
+ return sendResult(reply, await service.createManualRest(readProjectId(request), body));
23
+ });
24
+ fastify.post('/api/projects/:id/data-sources/test', async (request, reply) => {
25
+ const body = readOperationTestRequest(request.body);
26
+ if (!body)
27
+ return invalidPayload(reply, 'Data-source operation test payload is invalid.');
28
+ return sendResult(reply, await service.testOperation(readProjectId(request), body));
29
+ });
30
+ }
31
+ function readProjectId(request) {
32
+ return request.params.id;
33
+ }
34
+ function sendResult(reply, result) {
35
+ return result.ok ? result : reply.status(422).send(result);
36
+ }
37
+ function invalidPayload(reply, message) {
38
+ return reply.status(400).send({
39
+ ok: false,
40
+ diagnostics: [{ code: 'invalid-config', message, severity: 'error' }],
41
+ });
42
+ }
43
+ function readConnectRequest(value) {
44
+ const record = readRecord(value);
45
+ const protocol = record?.protocol;
46
+ if (!record ||
47
+ typeof record.sourceId !== 'string' ||
48
+ typeof record.url !== 'string' ||
49
+ (protocol !== 'auto' && protocol !== 'graphql' && protocol !== 'openapi')) {
50
+ return null;
51
+ }
52
+ return {
53
+ sourceId: record.sourceId,
54
+ url: record.url,
55
+ protocol,
56
+ name: readString(record.name),
57
+ description: readString(record.description),
58
+ credential: readCredential(record.credential),
59
+ };
60
+ }
61
+ function readManualRestRequest(value) {
62
+ const record = readRecord(value);
63
+ if (!record ||
64
+ typeof record.sourceId !== 'string' ||
65
+ typeof record.baseUrl !== 'string' ||
66
+ typeof record.endpointId !== 'string' ||
67
+ typeof record.path !== 'string' ||
68
+ typeof record.operationId !== 'string' ||
69
+ typeof record.method !== 'string' ||
70
+ !isIntent(record.intent)) {
71
+ return null;
72
+ }
73
+ return {
74
+ sourceId: record.sourceId,
75
+ baseUrl: record.baseUrl,
76
+ endpointId: record.endpointId,
77
+ path: record.path,
78
+ operationId: record.operationId,
79
+ method: record.method,
80
+ intent: record.intent,
81
+ name: readString(record.name),
82
+ description: readString(record.description),
83
+ credential: readCredential(record.credential),
84
+ };
85
+ }
86
+ function readOperationTestRequest(value) {
87
+ const record = readRecord(value);
88
+ if (!record ||
89
+ typeof record.sourceId !== 'string' ||
90
+ typeof record.endpointId !== 'string' ||
91
+ typeof record.operationId !== 'string') {
92
+ return null;
93
+ }
94
+ const values = readDataValues(record.values);
95
+ if (record.values !== undefined && values === undefined)
96
+ return null;
97
+ return {
98
+ sourceId: record.sourceId,
99
+ endpointId: record.endpointId,
100
+ operationId: record.operationId,
101
+ values,
102
+ dryRun: record.dryRun === true,
103
+ };
104
+ }
105
+ function readCredential(value) {
106
+ const record = readRecord(value);
107
+ if (!record || typeof record.id !== 'string' || typeof record.kind !== 'string')
108
+ return undefined;
109
+ return {
110
+ id: record.id,
111
+ kind: record.kind,
112
+ label: readString(record.label),
113
+ scope: readString(record.scope),
114
+ };
115
+ }
116
+ function readDataValues(value) {
117
+ if (value === undefined)
118
+ return undefined;
119
+ const record = readRecord(value);
120
+ if (!record || !Object.values(record).every(isDataContractValue))
121
+ return undefined;
122
+ return record;
123
+ }
124
+ function isDataContractValue(value) {
125
+ if (value === null || ['boolean', 'number', 'string'].includes(typeof value))
126
+ return true;
127
+ if (Array.isArray(value))
128
+ return value.every(isDataContractValue);
129
+ const record = readRecord(value);
130
+ return record !== null && Object.values(record).every(isDataContractValue);
131
+ }
132
+ function isIntent(value) {
133
+ return (value === 'action' ||
134
+ value === 'create' ||
135
+ value === 'delete' ||
136
+ value === 'read' ||
137
+ value === 'update');
138
+ }
139
+ function readRecord(value) {
140
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
141
+ ? value
142
+ : null;
143
+ }
144
+ function readString(value) {
145
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
146
+ }
147
+ //# sourceMappingURL=dataSourceRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataSourceRoutes.js","sourceRoot":"","sources":["../../../src/host/http/dataSourceRoutes.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type StartStudioHostServerOptions } from './server';
2
2
  /**
3
- * Starts the Studio host with the Phase 2 auth and metadata-only secret bridges registered.
3
+ * Starts the Studio host with trusted auth, secret, and data-source bridges registered.
4
4
  */
5
5
  export declare function startStudioHostServerWithSecrets(options?: number | StartStudioHostServerOptions): Promise<import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("node:http").IncomingMessage, import("node:http").ServerResponse<import("node:http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
6
6
  //# sourceMappingURL=serverWithSecrets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serverWithSecrets.d.ts","sourceRoot":"","sources":["../../../src/host/http/serverWithSecrets.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,KAAK,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,GAAE,MAAM,GAAG,4BAAiC,mRAmBpD"}
1
+ {"version":3,"file":"serverWithSecrets.d.ts","sourceRoot":"","sources":["../../../src/host/http/serverWithSecrets.ts"],"names":[],"mappings":"AAMA,OAAO,EAA0B,KAAK,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,GAAE,MAAM,GAAG,4BAAiC,mRAiBpD"}
@@ -2,10 +2,11 @@ import { ModuleManager } from '../orchestrator/moduleManager';
2
2
  import { ProjectManager } from '../orchestrator/projectManager';
3
3
  import { resolveWorkspaceRoot } from '../utils/workspaceRoot';
4
4
  import { registerProjectAuthRoutes } from './authRoutes';
5
+ import { registerProjectDataSourceRoutes } from './dataSourceRoutes';
5
6
  import { registerProjectSecretRoutes } from './secretRoutes';
6
7
  import { createStudioHostServer } from './server';
7
8
  /**
8
- * Starts the Studio host with the Phase 2 auth and metadata-only secret bridges registered.
9
+ * Starts the Studio host with trusted auth, secret, and data-source bridges registered.
9
10
  */
10
11
  export async function startStudioHostServerWithSecrets(options = {}) {
11
12
  const resolvedOptions = typeof options === 'number' ? { port: options } : options;
@@ -14,10 +15,8 @@ export async function startStudioHostServerWithSecrets(options = {}) {
14
15
  const projectManager = new ProjectManager(projectRoot);
15
16
  const fastify = await createStudioHostServer({ projectManager, orchestrator, projectRoot });
16
17
  registerProjectAuthRoutes(fastify, { projectManager, workspaceRoot: projectRoot });
17
- registerProjectSecretRoutes(fastify, {
18
- projectManager,
19
- workspaceRoot: projectRoot,
20
- });
18
+ registerProjectSecretRoutes(fastify, { projectManager, workspaceRoot: projectRoot });
19
+ registerProjectDataSourceRoutes(fastify, { projectManager, workspaceRoot: projectRoot });
21
20
  const port = resolvedOptions.port ?? 3000;
22
21
  const host = resolvedOptions.host ?? '127.0.0.1';
23
22
  await fastify.listen({ port, host });
@@ -1 +1 @@
1
- {"version":3,"file":"serverWithSecrets.js","sourceRoot":"","sources":["../../../src/host/http/serverWithSecrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,UAAiD,EAAE;IAEnD,MAAM,eAAe,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAClF,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5F,yBAAyB,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IACnF,2BAA2B,CAAC,OAAO,EAAE;QACnC,cAAc;QACd,aAAa,EAAE,WAAW;KAC3B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,WAAW,CAAC;IACjD,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"serverWithSecrets.js","sourceRoot":"","sources":["../../../src/host/http/serverWithSecrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,UAAiD,EAAE;IAEnD,MAAM,eAAe,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAClF,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5F,yBAAyB,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IACnF,2BAA2B,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IACrF,+BAA+B,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IAEzF,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,IAAI,WAAW,CAAC;IACjD,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,6 +1,10 @@
1
1
  export { type ProjectAuthHealthResult, ProjectAuthHealthService, } from './auth/projectAuthHealthService';
2
2
  export { createStudioHost, type CreateStudioHostOptions, type StudioHost, } from './createStudioHost';
3
+ export { createTrustedEndpointTestFetch } from './dataSources/createTrustedEndpointTestFetch';
4
+ export { createTrustedExternalApiFetch } from './dataSources/createTrustedExternalApiFetch';
5
+ export { StudioExternalApiService } from './dataSources/studioExternalApiService';
3
6
  export { registerProjectAuthRoutes } from './http/authRoutes';
7
+ export { registerProjectDataSourceRoutes } from './http/dataSourceRoutes';
4
8
  export { registerProjectSecretRoutes } from './http/secretRoutes';
5
9
  export { isOriginAllowed } from './http/security';
6
10
  export { createStudioHostServer, startStudioHostServer, type StartStudioHostServerOptions, } from './http/server';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAC5B,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,6 +1,10 @@
1
1
  export { ProjectAuthHealthService, } from './auth/projectAuthHealthService';
2
2
  export { createStudioHost, } from './createStudioHost';
3
+ export { createTrustedEndpointTestFetch } from './dataSources/createTrustedEndpointTestFetch';
4
+ export { createTrustedExternalApiFetch } from './dataSources/createTrustedExternalApiFetch';
5
+ export { StudioExternalApiService } from './dataSources/studioExternalApiService';
3
6
  export { registerProjectAuthRoutes } from './http/authRoutes';
7
+ export { registerProjectDataSourceRoutes } from './http/dataSourceRoutes';
4
8
  export { registerProjectSecretRoutes } from './http/secretRoutes';
5
9
  export { isOriginAllowed } from './http/security';
6
10
  export { createStudioHostServer, startStudioHostServer, } from './http/server';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAuB,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAEL,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,oBAAoB,GAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAC9F,OAAO,EAAE,6BAA6B,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAuB,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAEL,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,oBAAoB,GAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type ExternalApiSourceIdResult = {
2
+ readonly ok: true;
3
+ readonly sourceId: string;
4
+ } | {
5
+ readonly ok: false;
6
+ readonly message: string;
7
+ };
8
+ export declare function normalizeExternalApiSourceId(value: string): ExternalApiSourceIdResult;
9
+ //# sourceMappingURL=normalizeExternalApiSourceId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeExternalApiSourceId.d.ts","sourceRoot":"","sources":["../src/normalizeExternalApiSourceId.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GACjC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAWrF"}
@@ -0,0 +1,12 @@
1
+ export function normalizeExternalApiSourceId(value) {
2
+ const sourceId = value
3
+ .trim()
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9]+/gu, '-')
6
+ .replace(/^-+|-+$/gu, '')
7
+ .slice(0, 64);
8
+ return sourceId.length > 0
9
+ ? { ok: true, sourceId }
10
+ : { ok: false, message: 'Data-source ID must contain at least one letter or number.' };
11
+ }
12
+ //# sourceMappingURL=normalizeExternalApiSourceId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeExternalApiSourceId.js","sourceRoot":"","sources":["../src/normalizeExternalApiSourceId.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,MAAM,QAAQ,GAAG,KAAK;SACnB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,4DAA4D,EAAE,CAAC;AAC3F,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ApisAdminPage.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ApisAdminPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CACpC,kBAAkB,EAClB,MAAM,GAAG,kBAAkB,GAAG,gBAAgB,CAC/C,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,qBA6DhF"}
1
+ {"version":3,"file":"ApisAdminPage.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ApisAdminPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAOzD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CACpC,kBAAkB,EAClB,MAAM,GAAG,kBAAkB,GAAG,gBAAgB,CAC/C,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,qBAyBhF"}
@@ -1,21 +1,21 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Card, Text } from '@ankhorage/zora';
3
2
  import React from 'react';
4
- import { View } from 'react-native';
5
3
  import { useStudio } from '../../../core/StudioContext';
6
- import { AdminHeader, adminPageStyles, AdminScroll } from '../adminPagePrimitives';
7
- import { readRecord, readString } from '../adminPageUtils';
8
- import { collectDataSourceOperationRows } from './adminDataSourceOperations';
4
+ import { AdminHeader, AdminScroll } from '../adminPagePrimitives';
5
+ import { DataSourceCatalogCard } from './DataSourceCatalogCard';
6
+ import { DataSourceOperationsCard } from './DataSourceOperationsCard';
7
+ import { ExternalApiConnectCard } from './ExternalApiConnectCard';
8
+ import { ManualRestSourceCard } from './ManualRestSourceCard';
9
9
  export function ApisAdminPage({ routeId }) {
10
10
  const studio = useStudio();
11
- const dataSources = Object.entries(studio.manifest?.dataSources ?? {});
12
- const operationRows = collectDataSourceOperationRows(studio.manifest?.dataSources ?? {});
11
+ const dataSources = studio.manifest?.dataSources ?? {};
12
+ const showAuthoring = routeId === 'apis';
13
13
  const showSources = routeId === 'apis' || routeId === 'api-data-sources';
14
14
  const showOperations = routeId === 'apis' || routeId === 'api-operations';
15
15
  return (_jsxs(AdminScroll, { children: [_jsx(AdminHeader, { title: routeId === 'api-operations'
16
16
  ? 'Operations'
17
17
  : routeId === 'api-data-sources'
18
18
  ? 'Data sources'
19
- : 'APIs', description: "Current data-source and runtime operation configuration from the Studio manifest." }), showSources ? (_jsx(Card, { title: "Data sources", children: dataSources.length > 0 ? (dataSources.map(([id, source]) => (_jsxs(View, { style: adminPageStyles.row, children: [_jsx(Text, { weight: "semiBold", children: id }), _jsx(Text, { color: "neutral", emphasis: "muted", variant: "bodySmall", children: readString(readRecord(source).kind) ?? 'data source' })] }, id)))) : (_jsx(Text, { color: "neutral", emphasis: "muted", children: "No data sources are configured." })) })) : null, showOperations ? (_jsx(Card, { title: "Operations", children: operationRows.length > 0 ? (operationRows.map((row) => (_jsxs(View, { style: adminPageStyles.row, children: [_jsx(Text, { weight: "semiBold", children: row.operationId }), _jsxs(Text, { color: "neutral", emphasis: "muted", variant: "bodySmall", children: [row.sourceId, " / ", row.endpointId, " - ", row.kind, row.protocol ? ` (${row.protocol})` : ''] })] }, `${row.sourceId}:${row.endpointId}:${row.operationId}`)))) : (_jsx(Text, { color: "neutral", emphasis: "muted", children: "No runtime operations are configured." })) })) : null] }));
19
+ : 'APIs', description: "Connect external services into canonical data sources and inspect their runtime operations." }), showAuthoring ? _jsx(ExternalApiConnectCard, {}) : null, showAuthoring ? _jsx(ManualRestSourceCard, {}) : null, showSources ? _jsx(DataSourceCatalogCard, { dataSources: dataSources }) : null, showOperations ? _jsx(DataSourceOperationsCard, { dataSources: dataSources }) : null] }));
20
20
  }
21
21
  //# sourceMappingURL=ApisAdminPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApisAdminPage.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ApisAdminPage.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApisAdminPage.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/ApisAdminPage.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAO9D,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAA0C;IAC/E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;IACvD,MAAM,aAAa,GAAG,OAAO,KAAK,MAAM,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,kBAAkB,CAAC;IACzE,MAAM,cAAc,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,gBAAgB,CAAC;IAE1E,OAAO,CACL,MAAC,WAAW,eACV,KAAC,WAAW,IACV,KAAK,EACH,OAAO,KAAK,gBAAgB;oBAC1B,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,OAAO,KAAK,kBAAkB;wBAC9B,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,MAAM,EAEd,WAAW,EAAC,6FAA6F,GACzG,EACD,aAAa,CAAC,CAAC,CAAC,KAAC,sBAAsB,KAAG,CAAC,CAAC,CAAC,IAAI,EACjD,aAAa,CAAC,CAAC,CAAC,KAAC,oBAAoB,KAAG,CAAC,CAAC,CAAC,IAAI,EAC/C,WAAW,CAAC,CAAC,CAAC,KAAC,qBAAqB,IAAC,WAAW,EAAE,WAAW,GAAI,CAAC,CAAC,CAAC,IAAI,EACxE,cAAc,CAAC,CAAC,CAAC,KAAC,wBAAwB,IAAC,WAAW,EAAE,WAAW,GAAI,CAAC,CAAC,CAAC,IAAI,IACnE,CACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DataSourceRegistry } from '@ankhorage/contracts/data';
2
+ export declare function DataSourceCatalogCard({ dataSources, }: {
3
+ readonly dataSources: DataSourceRegistry;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=DataSourceCatalogCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataSourceCatalogCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/DataSourceCatalogCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAMtF,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,GACZ,EAAE;IACD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC1C,+BA2BA"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, Text } from '@ankhorage/zora';
3
+ import { View } from 'react-native';
4
+ import { externalApiAdminStyles } from './ExternalApiAdminPrimitives';
5
+ export function DataSourceCatalogCard({ dataSources, }) {
6
+ const entries = Object.entries(dataSources);
7
+ return (_jsx(Card, { title: "Connected data sources", children: entries.length === 0 ? (_jsx(Text, { color: "neutral", emphasis: "muted", children: "No data sources are configured." })) : (_jsx(View, { style: externalApiAdminStyles.stack, children: entries.map(([id, source]) => (_jsxs(View, { style: externalApiAdminStyles.row, children: [_jsx(Text, { weight: "semiBold", children: source.name ?? id }), _jsxs(Text, { color: "neutral", emphasis: "muted", variant: "bodySmall", children: [id, " \u00B7 ", source.kind, " \u00B7 ", countOperations(source), " operations"] }), describeLocation(source) ? (_jsx(Text, { color: "neutral", variant: "caption", children: describeLocation(source) })) : null] }, id))) })) }));
8
+ }
9
+ function countOperations(source) {
10
+ return Object.values(source.endpoints).reduce((count, endpoint) => count + Object.keys(endpoint.operations).length, 0);
11
+ }
12
+ function describeLocation(source) {
13
+ if (source.kind === 'graphql')
14
+ return source.endpointUrl;
15
+ if (source.kind === 'openapi' || source.kind === 'rest')
16
+ return source.baseUrl;
17
+ return undefined;
18
+ }
19
+ //# sourceMappingURL=DataSourceCatalogCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataSourceCatalogCard.js","sourceRoot":"","sources":["../../../../src/ui/admin/pages/DataSourceCatalogCard.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,MAAM,UAAU,qBAAqB,CAAC,EACpC,WAAW,GAGZ;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAC,wBAAwB,YACjC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,gDAE/B,CACR,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,sBAAsB,CAAC,KAAK,YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAC7B,MAAC,IAAI,IAAU,KAAK,EAAE,sBAAsB,CAAC,GAAG,aAC9C,KAAC,IAAI,IAAC,MAAM,EAAC,UAAU,YAAE,MAAM,CAAC,IAAI,IAAI,EAAE,GAAQ,EAClD,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,WAAW,aACvD,EAAE,cAAK,MAAM,CAAC,IAAI,cAAK,eAAe,CAAC,MAAM,CAAC,mBAC1C,EACN,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAC1B,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAC,SAAS,YACpC,gBAAgB,CAAC,MAAM,CAAC,GACpB,CACR,CAAC,CAAC,CAAC,IAAI,KATC,EAAE,CAUN,CACR,CAAC,GACG,CACR,GACI,CACR,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAwB;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EACpE,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAwB;IAChD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,WAAW,CAAC;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAC/E,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DataSourceRegistry } from '@ankhorage/contracts/data';
2
+ export declare function DataSourceOperationsCard({ dataSources, }: {
3
+ readonly dataSources: DataSourceRegistry;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=DataSourceOperationsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataSourceOperationsCard.d.ts","sourceRoot":"","sources":["../../../../src/ui/admin/pages/DataSourceOperationsCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAcpE,wBAAgB,wBAAwB,CAAC,EACvC,WAAW,GACZ,EAAE;IACD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC1C,+BA+DA"}
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Card, Text } from '@ankhorage/zora';
3
+ import { useCallback, useMemo, useState } from 'react';
4
+ import { View } from 'react-native';
5
+ import { testExternalApiOperation } from '../../../externalApiApi';
6
+ import { useStudio } from '../../../core/StudioContext';
7
+ import { collectDataSourceOperationRows, } from './adminDataSourceOperations';
8
+ import { ExternalApiDiagnosticList, externalApiAdminStyles } from './ExternalApiAdminPrimitives';
9
+ export function DataSourceOperationsCard({ dataSources, }) {
10
+ const studio = useStudio();
11
+ const rows = useMemo(() => collectDataSourceOperationRows(dataSources), [dataSources]);
12
+ const [busyKey, setBusyKey] = useState(null);
13
+ const [results, setResults] = useState({});
14
+ const run = useCallback(async (row, dryRun) => {
15
+ const key = operationKey(row);
16
+ setBusyKey(key);
17
+ try {
18
+ const result = await testExternalApiOperation(studio.projectId, {
19
+ sourceId: row.sourceId,
20
+ endpointId: row.endpointId,
21
+ operationId: row.operationId,
22
+ dryRun,
23
+ });
24
+ setResults((current) => ({ ...current, [key]: result }));
25
+ }
26
+ finally {
27
+ setBusyKey(null);
28
+ }
29
+ }, [studio.projectId]);
30
+ return (_jsx(Card, { title: "Operations", children: rows.length === 0 ? (_jsx(Text, { color: "neutral", emphasis: "muted", children: "No runtime operations are configured." })) : (_jsx(View, { style: externalApiAdminStyles.stack, children: rows.map((row) => {
31
+ const key = operationKey(row);
32
+ const result = results[key];
33
+ return (_jsxs(View, { style: externalApiAdminStyles.operation, children: [_jsx(Text, { weight: "semiBold", children: row.name ?? row.operationId }), _jsxs(Text, { color: "neutral", emphasis: "muted", variant: "bodySmall", children: [row.sourceId, " / ", row.endpointId, " \u00B7 ", row.method ?? row.protocol ?? 'operation', ' ', row.path ?? '', " \u00B7 ", row.kind] }), _jsxs(View, { style: externalApiAdminStyles.actions, children: [_jsx(Button, { variant: "outline", loading: busyKey === key, onPress: () => void run(row, true), children: "Dry run" }), _jsx(Button, { loading: busyKey === key, onPress: () => void run(row, false), children: "Execute" })] }), result ? _jsx(OperationResult, { result: result }) : null] }, key));
34
+ }) })) }));
35
+ }
36
+ function OperationResult({ result }) {
37
+ return (_jsxs(View, { style: externalApiAdminStyles.feedback, children: [result.request ? (_jsxs(Text, { variant: "caption", children: [result.request.dryRun ? 'Prepared' : 'Sent', " ", result.request.method, " ", result.request.url] })) : null, result.response ? (_jsxs(Text, { variant: "caption", children: ["HTTP ", result.response.status, " \u00B7 ", result.response.ok ? 'success' : 'failure'] })) : null, result.ok && result.data !== undefined ? (_jsx(Text, { selectable: true, variant: "caption", children: formatData(result.data) })) : null, _jsx(ExternalApiDiagnosticList, { diagnostics: result.diagnostics })] }));
38
+ }
39
+ function operationKey(row) {
40
+ return `${row.sourceId}:${row.endpointId}:${row.operationId}`;
41
+ }
42
+ function formatData(value) {
43
+ const serialized = JSON.stringify(value, null, 2);
44
+ return serialized.length > 1_500 ? `${serialized.slice(0, 1_500)}…` : serialized;
45
+ }
46
+ //# sourceMappingURL=DataSourceOperationsCard.js.map