@ankhorage/data-sources 0.5.5 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +12 -5
  3. package/dist/discovery/index.d.ts +64 -0
  4. package/dist/discovery/index.d.ts.map +1 -0
  5. package/dist/discovery/index.js +195 -0
  6. package/dist/discovery/index.js.map +1 -0
  7. package/dist/generated-api/index.d.ts +10 -0
  8. package/dist/generated-api/index.d.ts.map +1 -0
  9. package/dist/generated-api/index.js +272 -0
  10. package/dist/generated-api/index.js.map +1 -0
  11. package/dist/graphql/index.d.ts +3 -3
  12. package/dist/graphql/index.d.ts.map +1 -1
  13. package/dist/graphql/index.js +24 -60
  14. package/dist/graphql/index.js.map +1 -1
  15. package/dist/index.d.ts +10 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +18 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/openapi/index.d.ts +2 -2
  20. package/dist/openapi/index.d.ts.map +1 -1
  21. package/dist/openapi/index.js +19 -29
  22. package/dist/openapi/index.js.map +1 -1
  23. package/dist/rest/index.d.ts +3 -3
  24. package/dist/rest/index.d.ts.map +1 -1
  25. package/dist/rest/index.js +51 -51
  26. package/dist/rest/index.js.map +1 -1
  27. package/dist/test-runner/index.d.ts.map +1 -1
  28. package/dist/test-runner/index.js +60 -104
  29. package/dist/test-runner/index.js.map +1 -1
  30. package/package.json +2 -2
  31. package/src/discovery/index.test.ts +133 -0
  32. package/src/discovery/index.ts +340 -0
  33. package/src/{managed-api → generated-api}/index.test.ts +59 -67
  34. package/src/generated-api/index.ts +410 -0
  35. package/src/graphql/index.test.ts +28 -134
  36. package/src/graphql/index.ts +29 -89
  37. package/src/index.test.ts +25 -18
  38. package/src/index.ts +29 -7
  39. package/src/openapi/index.test.ts +36 -246
  40. package/src/openapi/index.ts +22 -60
  41. package/src/rest/index.test.ts +22 -173
  42. package/src/rest/index.ts +62 -59
  43. package/src/test-runner/index.test.ts +82 -150
  44. package/src/test-runner/index.ts +73 -143
  45. package/dist/managed-api/index.d.ts +0 -30
  46. package/dist/managed-api/index.d.ts.map +0 -1
  47. package/dist/managed-api/index.js +0 -257
  48. package/dist/managed-api/index.js.map +0 -1
  49. package/src/managed-api/index.ts +0 -364
@@ -13,22 +13,23 @@ export function importOpenApiDocument(input) {
13
13
  const baseUrl = resolveOpenApiBaseUrl(input, diagnostics);
14
14
  const schemas = normalizeOpenApiSchemas(input.document.components?.schemas, input.id, diagnostics);
15
15
  const endpoints = normalizeOpenApiEndpoints(input, baseUrl, diagnostics);
16
- const hasErrors = diagnostics.some((diagnostic) => diagnostic.severity === 'error');
17
- if (hasErrors) {
16
+ if (baseUrl === undefined || diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {
18
17
  return { ok: false, diagnostics };
19
18
  }
20
19
  return {
21
20
  ok: true,
22
21
  data: {
23
22
  id: input.id,
24
- kind: 'openapi',
23
+ kind: 'api',
24
+ origin: 'external',
25
+ protocol: 'rest',
25
26
  name: input.name ?? input.document.info?.title,
26
27
  description: input.description ?? input.document.info?.description,
27
28
  baseUrl,
28
29
  credential: input.credential,
29
30
  endpoints,
30
31
  schemas,
31
- import: {
32
+ openApi: {
32
33
  url: input.documentUrl,
33
34
  documentId: input.documentId,
34
35
  version: input.document.info?.version,
@@ -56,7 +57,6 @@ export function normalizeOpenApiEndpointId(path) {
56
57
  return normalized.length > 0 ? normalized : 'root';
57
58
  }
58
59
  export function normalizeOpenApiSchema(schema) {
59
- const additionalProperties = normalizeAdditionalProperties(schema.additionalProperties);
60
60
  return {
61
61
  ref: normalizeOpenApiSchemaRef(schema.$ref),
62
62
  type: normalizeSchemaType(schema.type),
@@ -69,7 +69,7 @@ export function normalizeOpenApiSchema(schema) {
69
69
  nullable: schema.nullable,
70
70
  required: schema.required,
71
71
  properties: normalizeSchemaRecord(schema.properties),
72
- additionalProperties,
72
+ additionalProperties: normalizeAdditionalProperties(schema.additionalProperties),
73
73
  items: schema.items === undefined ? undefined : normalizeOpenApiSchema(schema.items),
74
74
  allOf: normalizeSchemaList(schema.allOf),
75
75
  anyOf: normalizeSchemaList(schema.anyOf),
@@ -77,16 +77,16 @@ export function normalizeOpenApiSchema(schema) {
77
77
  };
78
78
  }
79
79
  function resolveOpenApiBaseUrl(input, diagnostics) {
80
- if (input.baseUrl !== undefined)
80
+ if (input.baseUrl !== undefined && input.baseUrl.trim().length > 0)
81
81
  return input.baseUrl;
82
82
  const servers = input.document.servers ?? [];
83
83
  if (servers.length === 0) {
84
84
  diagnostics.push({
85
85
  code: 'ambiguous-server',
86
86
  dataSourceId: input.id,
87
- message: 'OpenAPI document does not define a server URL and no baseUrl override was provided.',
87
+ message: 'OpenAPI import requires a server URL or an explicit baseUrl override.',
88
88
  path: 'servers',
89
- severity: 'warning',
89
+ severity: 'error',
90
90
  });
91
91
  return undefined;
92
92
  }
@@ -134,8 +134,6 @@ function normalizeOpenApiEndpoints(input, baseUrl, diagnostics) {
134
134
  continue;
135
135
  const operationId = resolveUniqueOperationId(input.id, endpointId, method, path, operation.operationId, operationIds, diagnostics);
136
136
  const parameters = normalizeOpenApiParameters([...(pathItem.parameters ?? []), ...(operation.parameters ?? [])], input.id, endpointId, operationId, diagnostics);
137
- const request = normalizeOpenApiRequest(operation.requestBody, parameters);
138
- const response = normalizeOpenApiResponse(operation.responses);
139
137
  operations[operationId] = {
140
138
  id: operationId,
141
139
  endpointId,
@@ -145,8 +143,8 @@ function normalizeOpenApiEndpoints(input, baseUrl, diagnostics) {
145
143
  intent: mapOpenApiMethodToIntent(method),
146
144
  method: method.toUpperCase(),
147
145
  path,
148
- request,
149
- response,
146
+ request: normalizeOpenApiRequest(operation.requestBody, parameters),
147
+ response: normalizeOpenApiResponse(operation.responses),
150
148
  metadata: {
151
149
  deprecated: operation.deprecated ?? false,
152
150
  source: 'openapi',
@@ -277,34 +275,26 @@ function normalizeOpenApiSchemaRef(ref) {
277
275
  if (ref === undefined)
278
276
  return undefined;
279
277
  const prefix = '#/components/schemas/';
280
- if (ref.startsWith(prefix))
281
- return { id: ref.slice(prefix.length) };
282
- return { id: ref };
278
+ return { id: ref.startsWith(prefix) ? ref.slice(prefix.length) : ref };
283
279
  }
284
280
  function normalizeSchemaRecord(record) {
285
281
  if (record === undefined)
286
282
  return undefined;
287
- const normalized = {};
288
- for (const [key, schema] of Object.entries(record)) {
289
- normalized[key] = normalizeOpenApiSchema(schema);
290
- }
291
- return normalized;
283
+ return Object.fromEntries(Object.entries(record).map(([key, schema]) => [key, normalizeOpenApiSchema(schema)]));
292
284
  }
293
285
  function normalizeSchemaList(list) {
294
- return list?.map((schema) => normalizeOpenApiSchema(schema));
286
+ return list?.map(normalizeOpenApiSchema);
295
287
  }
296
- function normalizeAdditionalProperties(additionalProperties) {
297
- if (additionalProperties === undefined || typeof additionalProperties === 'boolean') {
298
- return additionalProperties;
299
- }
300
- return normalizeOpenApiSchema(additionalProperties);
288
+ function normalizeAdditionalProperties(value) {
289
+ if (value === undefined || typeof value === 'boolean')
290
+ return value;
291
+ return normalizeOpenApiSchema(value);
301
292
  }
302
293
  function normalizeSchemaType(type) {
303
294
  if (type === undefined)
304
295
  return undefined;
305
- if (typeof type === 'string') {
296
+ if (typeof type === 'string')
306
297
  return isDataSchemaPrimitive(type) ? type : undefined;
307
- }
308
298
  return type.filter(isDataSchemaPrimitive);
309
299
  }
310
300
  function isDataSchemaPrimitive(type) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CredentialRef,\n DataContractValue,\n DataEndpointConfig,\n DataOperationConfig,\n DataOperationIntent,\n DataOperationParameter,\n DataOperationParameterLocation,\n DataOperationRequest,\n DataOperationResponse,\n DataSchema,\n DataSchemaPrimitiveType,\n DataSchemaRegistry,\n DataSourceDiagnostic,\n DataSourceDiagnosticResult,\n EndpointId,\n OpenApiDataSourceConfig,\n OperationId,\n} from '@ankhorage/contracts/data';\n\nconst OPENAPI_HTTP_METHODS = ['delete', 'get', 'head', 'options', 'patch', 'post', 'put'] as const;\nconst DATA_SCHEMA_PRIMITIVES = [\n 'array',\n 'boolean',\n 'integer',\n 'null',\n 'number',\n 'object',\n 'string',\n] as const satisfies readonly DataSchemaPrimitiveType[];\n\nexport type OpenApiHttpMethod = (typeof OPENAPI_HTTP_METHODS)[number];\n\nexport interface OpenApiServerObject {\n readonly url: string;\n readonly description?: string;\n}\n\nexport interface OpenApiSchemaObject {\n readonly $ref?: string;\n readonly type?: string | readonly string[];\n readonly title?: string;\n readonly description?: string;\n readonly enum?: readonly DataContractValue[];\n readonly const?: DataContractValue;\n readonly default?: DataContractValue;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly required?: readonly string[];\n readonly properties?: Readonly<Record<string, OpenApiSchemaObject>>;\n readonly additionalProperties?: boolean | OpenApiSchemaObject;\n readonly items?: OpenApiSchemaObject;\n readonly allOf?: readonly OpenApiSchemaObject[];\n readonly anyOf?: readonly OpenApiSchemaObject[];\n readonly oneOf?: readonly OpenApiSchemaObject[];\n}\n\nexport interface OpenApiMediaTypeObject {\n readonly schema?: OpenApiSchemaObject;\n}\n\nexport interface OpenApiRequestBodyObject {\n readonly description?: string;\n readonly required?: boolean;\n readonly content?: Readonly<Record<string, OpenApiMediaTypeObject>>;\n}\n\nexport interface OpenApiResponseObject {\n readonly description?: string;\n readonly content?: Readonly<Record<string, OpenApiMediaTypeObject>>;\n}\n\nexport interface OpenApiParameterObject {\n readonly name: string;\n readonly in: string;\n readonly required?: boolean;\n readonly description?: string;\n readonly schema?: OpenApiSchemaObject;\n}\n\nexport interface OpenApiOperationObject {\n readonly operationId?: string;\n readonly summary?: string;\n readonly description?: string;\n readonly deprecated?: boolean;\n readonly parameters?: readonly OpenApiParameterObject[];\n readonly requestBody?: OpenApiRequestBodyObject;\n readonly responses?: Readonly<Record<string, OpenApiResponseObject>>;\n}\n\nexport type OpenApiPathItemObject = Partial<Record<OpenApiHttpMethod, OpenApiOperationObject>> & {\n readonly parameters?: readonly OpenApiParameterObject[];\n};\n\nexport interface OpenApiComponentsObject {\n readonly schemas?: Readonly<Record<string, OpenApiSchemaObject>>;\n readonly securitySchemes?: Readonly<Record<string, DataContractValue>>;\n}\n\nexport interface OpenApiDocumentObject {\n readonly openapi?: string;\n readonly info?: {\n readonly title?: string;\n readonly version?: string;\n readonly description?: string;\n };\n readonly servers?: readonly OpenApiServerObject[];\n readonly paths?: Readonly<Record<string, OpenApiPathItemObject>>;\n readonly components?: OpenApiComponentsObject;\n}\n\nexport interface OpenApiImportInput {\n readonly id: string;\n readonly document: OpenApiDocumentObject;\n readonly baseUrl?: string;\n readonly credential?: CredentialRef;\n readonly documentId?: string;\n readonly documentUrl?: string;\n readonly name?: string;\n readonly description?: string;\n readonly metadata?: DataContractValue;\n}\n\nexport type OpenApiImportResult = DataSourceDiagnosticResult<OpenApiDataSourceConfig>;\n\nexport function importOpenApiDocument(input: OpenApiImportInput): OpenApiImportResult {\n const diagnostics: DataSourceDiagnostic[] = [];\n const baseUrl = resolveOpenApiBaseUrl(input, diagnostics);\n const schemas = normalizeOpenApiSchemas(\n input.document.components?.schemas,\n input.id,\n diagnostics,\n );\n const endpoints = normalizeOpenApiEndpoints(input, baseUrl, diagnostics);\n const hasErrors = diagnostics.some((diagnostic) => diagnostic.severity === 'error');\n\n if (hasErrors) {\n return { ok: false, diagnostics };\n }\n\n return {\n ok: true,\n data: {\n id: input.id,\n kind: 'openapi',\n name: input.name ?? input.document.info?.title,\n description: input.description ?? input.document.info?.description,\n baseUrl,\n credential: input.credential,\n endpoints,\n schemas,\n import: {\n url: input.documentUrl,\n documentId: input.documentId,\n version: input.document.info?.version,\n },\n metadata: input.metadata,\n },\n diagnostics,\n };\n}\n\nexport function normalizeOpenApiOperationId(\n method: OpenApiHttpMethod,\n path: string,\n operationId?: string,\n): OperationId {\n const rawId = operationId ?? `${method}-${path}`;\n const normalized = rawId\n .replace(/\\{([^}]+)\\}/g, '$1')\n .replace(/[^A-Za-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n\n return normalized.length > 0 ? normalized : `${method}-root`;\n}\n\nexport function normalizeOpenApiEndpointId(path: string): EndpointId {\n const normalized = path\n .replace(/\\{([^}]+)\\}/g, '$1')\n .replace(/[^A-Za-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n\n return normalized.length > 0 ? normalized : 'root';\n}\n\nexport function normalizeOpenApiSchema(schema: OpenApiSchemaObject): DataSchema {\n const additionalProperties = normalizeAdditionalProperties(schema.additionalProperties);\n\n return {\n ref: normalizeOpenApiSchemaRef(schema.$ref),\n type: normalizeSchemaType(schema.type),\n title: schema.title,\n description: schema.description,\n enum: schema.enum,\n const: schema.const,\n default: schema.default,\n format: schema.format,\n nullable: schema.nullable,\n required: schema.required,\n properties: normalizeSchemaRecord(schema.properties),\n additionalProperties,\n items: schema.items === undefined ? undefined : normalizeOpenApiSchema(schema.items),\n allOf: normalizeSchemaList(schema.allOf),\n anyOf: normalizeSchemaList(schema.anyOf),\n oneOf: normalizeSchemaList(schema.oneOf),\n };\n}\n\nfunction resolveOpenApiBaseUrl(\n input: OpenApiImportInput,\n diagnostics: DataSourceDiagnostic[],\n): string | undefined {\n if (input.baseUrl !== undefined) return input.baseUrl;\n\n const servers = input.document.servers ?? [];\n\n if (servers.length === 0) {\n diagnostics.push({\n code: 'ambiguous-server',\n dataSourceId: input.id,\n message:\n 'OpenAPI document does not define a server URL and no baseUrl override was provided.',\n path: 'servers',\n severity: 'warning',\n });\n return undefined;\n }\n\n if (servers.length > 1) {\n diagnostics.push({\n code: 'ambiguous-server',\n dataSourceId: input.id,\n message: 'OpenAPI document defines multiple servers. The first server URL was selected.',\n path: 'servers',\n severity: 'warning',\n });\n }\n\n return servers[0]?.url;\n}\n\nfunction normalizeOpenApiSchemas(\n schemas: Readonly<Record<string, OpenApiSchemaObject>> | undefined,\n dataSourceId: string,\n diagnostics: DataSourceDiagnostic[],\n): DataSchemaRegistry | undefined {\n if (schemas === undefined) return undefined;\n\n const registry: Record<string, DataSchema> = {};\n\n for (const [schemaId, schema] of Object.entries(schemas)) {\n registry[schemaId] = normalizeOpenApiSchema(schema);\n collectUnsupportedSchemaDiagnostics(\n schema,\n dataSourceId,\n `components.schemas.${schemaId}`,\n diagnostics,\n );\n }\n\n return registry;\n}\n\nfunction normalizeOpenApiEndpoints(\n input: OpenApiImportInput,\n baseUrl: string | undefined,\n diagnostics: DataSourceDiagnostic[],\n): Record<EndpointId, DataEndpointConfig> {\n const { paths } = input.document;\n\n if (paths === undefined || Object.keys(paths).length === 0) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: input.id,\n message: 'OpenAPI document must define at least one path.',\n path: 'paths',\n severity: 'error',\n });\n return {};\n }\n\n const endpoints: Record<EndpointId, DataEndpointConfig> = {};\n const operationIds = new Set<OperationId>();\n\n for (const [path, pathItem] of Object.entries(paths)) {\n const endpointId = normalizeOpenApiEndpointId(path);\n const operations: Record<OperationId, DataOperationConfig> = {};\n\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method];\n if (operation === undefined) continue;\n\n const operationId = resolveUniqueOperationId(\n input.id,\n endpointId,\n method,\n path,\n operation.operationId,\n operationIds,\n diagnostics,\n );\n const parameters = normalizeOpenApiParameters(\n [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])],\n input.id,\n endpointId,\n operationId,\n diagnostics,\n );\n const request = normalizeOpenApiRequest(operation.requestBody, parameters);\n const response = normalizeOpenApiResponse(operation.responses);\n\n operations[operationId] = {\n id: operationId,\n endpointId,\n name: operation.summary,\n description: operation.description,\n protocol: 'http',\n intent: mapOpenApiMethodToIntent(method),\n method: method.toUpperCase(),\n path,\n request,\n response,\n metadata: {\n deprecated: operation.deprecated ?? false,\n source: 'openapi',\n },\n };\n }\n\n endpoints[endpointId] = {\n id: endpointId,\n kind: 'http',\n baseUrl,\n path,\n credential: input.credential,\n operations,\n };\n }\n\n return endpoints;\n}\n\nfunction resolveUniqueOperationId(\n dataSourceId: string,\n endpointId: EndpointId,\n method: OpenApiHttpMethod,\n path: string,\n operationId: string | undefined,\n operationIds: Set<OperationId>,\n diagnostics: DataSourceDiagnostic[],\n): OperationId {\n const normalized = normalizeOpenApiOperationId(method, path, operationId);\n\n if (!operationIds.has(normalized)) {\n operationIds.add(normalized);\n return normalized;\n }\n\n let suffix = 2;\n let uniqueId: OperationId = `${normalized}-${suffix}`;\n\n while (operationIds.has(uniqueId)) {\n suffix += 1;\n uniqueId = `${normalized}-${suffix}`;\n }\n\n operationIds.add(uniqueId);\n diagnostics.push({\n code: 'duplicate-operation-id',\n dataSourceId,\n endpointId,\n operationId: uniqueId,\n message: `OpenAPI operation id '${normalized}' is duplicated. Normalized to '${uniqueId}'.`,\n path: `paths.${path}.${method}.operationId`,\n severity: 'warning',\n });\n\n return uniqueId;\n}\n\nfunction normalizeOpenApiParameters(\n parameters: readonly OpenApiParameterObject[],\n dataSourceId: string,\n endpointId: EndpointId,\n operationId: OperationId,\n diagnostics: DataSourceDiagnostic[],\n): readonly DataOperationParameter[] | undefined {\n if (parameters.length === 0) return undefined;\n\n const normalized: DataOperationParameter[] = [];\n\n for (const parameter of parameters) {\n const location = normalizeParameterLocation(parameter.in);\n\n if (location === undefined) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId,\n endpointId,\n operationId,\n message: `OpenAPI parameter '${parameter.name}' uses unsupported location '${parameter.in}'.`,\n path: `paths.${endpointId}.parameters.${parameter.name}`,\n severity: 'warning',\n });\n continue;\n }\n\n normalized.push({\n name: parameter.name,\n location,\n required: parameter.required,\n description: parameter.description,\n schema: parameter.schema === undefined ? undefined : normalizeOpenApiSchema(parameter.schema),\n });\n }\n\n return normalized;\n}\n\nfunction normalizeParameterLocation(location: string): DataOperationParameterLocation | undefined {\n if (\n location === 'cookie' ||\n location === 'header' ||\n location === 'path' ||\n location === 'query'\n ) {\n return location;\n }\n\n return undefined;\n}\n\nfunction normalizeOpenApiRequest(\n requestBody: OpenApiRequestBodyObject | undefined,\n parameters: readonly DataOperationParameter[] | undefined,\n): DataOperationRequest | undefined {\n const content = firstContentEntry(requestBody?.content);\n\n if (requestBody === undefined && parameters === undefined) return undefined;\n\n return {\n contentType: content?.contentType,\n parameters,\n schema: content?.schema === undefined ? undefined : normalizeOpenApiSchema(content.schema),\n };\n}\n\nfunction normalizeOpenApiResponse(\n responses: Readonly<Record<string, OpenApiResponseObject>> | undefined,\n): DataOperationResponse | undefined {\n if (responses === undefined) return undefined;\n\n const status = chooseResponseStatus(Object.keys(responses));\n if (status === undefined) return undefined;\n\n const response = responses[status];\n const content = firstContentEntry(response?.content);\n\n return {\n status,\n contentType: content?.contentType,\n description: response?.description,\n schema: content?.schema === undefined ? undefined : normalizeOpenApiSchema(content.schema),\n };\n}\n\nfunction firstContentEntry(\n content: Readonly<Record<string, OpenApiMediaTypeObject>> | undefined,\n): { readonly contentType: string; readonly schema?: OpenApiSchemaObject } | undefined {\n if (content === undefined) return undefined;\n\n const [entry] = Object.entries(content);\n if (entry === undefined) return undefined;\n\n const [contentType, media] = entry;\n return { contentType, schema: media.schema };\n}\n\nfunction chooseResponseStatus(statuses: readonly string[]): string | undefined {\n return statuses.find((status) => status.startsWith('2')) ?? statuses[0];\n}\n\nfunction mapOpenApiMethodToIntent(method: OpenApiHttpMethod): DataOperationIntent {\n if (method === 'get' || method === 'head') return 'read';\n if (method === 'post') return 'create';\n if (method === 'delete') return 'delete';\n if (method === 'patch' || method === 'put') return 'update';\n return 'action';\n}\n\nfunction normalizeOpenApiSchemaRef(ref: string | undefined): { readonly id: string } | undefined {\n if (ref === undefined) return undefined;\n\n const prefix = '#/components/schemas/';\n if (ref.startsWith(prefix)) return { id: ref.slice(prefix.length) };\n\n return { id: ref };\n}\n\nfunction normalizeSchemaRecord(\n record: Readonly<Record<string, OpenApiSchemaObject>> | undefined,\n): Readonly<Record<string, DataSchema>> | undefined {\n if (record === undefined) return undefined;\n\n const normalized: Record<string, DataSchema> = {};\n\n for (const [key, schema] of Object.entries(record)) {\n normalized[key] = normalizeOpenApiSchema(schema);\n }\n\n return normalized;\n}\n\nfunction normalizeSchemaList(\n list: readonly OpenApiSchemaObject[] | undefined,\n): readonly DataSchema[] | undefined {\n return list?.map((schema) => normalizeOpenApiSchema(schema));\n}\n\nfunction normalizeAdditionalProperties(\n additionalProperties: boolean | OpenApiSchemaObject | undefined,\n): boolean | DataSchema | undefined {\n if (additionalProperties === undefined || typeof additionalProperties === 'boolean') {\n return additionalProperties;\n }\n\n return normalizeOpenApiSchema(additionalProperties);\n}\n\nfunction normalizeSchemaType(\n type: string | readonly string[] | undefined,\n): DataSchemaPrimitiveType | readonly DataSchemaPrimitiveType[] | undefined {\n if (type === undefined) return undefined;\n\n if (typeof type === 'string') {\n return isDataSchemaPrimitive(type) ? type : undefined;\n }\n\n return type.filter(isDataSchemaPrimitive);\n}\n\nfunction isDataSchemaPrimitive(type: string): type is DataSchemaPrimitiveType {\n return DATA_SCHEMA_PRIMITIVES.some((primitive) => primitive === type);\n}\n\nfunction collectUnsupportedSchemaDiagnostics(\n schema: OpenApiSchemaObject,\n dataSourceId: string,\n path: string,\n diagnostics: DataSourceDiagnostic[],\n): void {\n if (typeof schema.type === 'string' && !isDataSchemaPrimitive(schema.type)) {\n diagnostics.push({\n code: 'unsupported-schema',\n dataSourceId,\n message: `OpenAPI schema type '${schema.type}' is not supported by the normalized schema model.`,\n path: `${path}.type`,\n severity: 'warning',\n });\n }\n\n for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {\n collectUnsupportedSchemaDiagnostics(\n propertySchema,\n dataSourceId,\n `${path}.properties.${propertyName}`,\n diagnostics,\n );\n }\n\n if (schema.items !== undefined) {\n collectUnsupportedSchemaDiagnostics(schema.items, dataSourceId, `${path}.items`, diagnostics);\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CredentialRef,\n DataContractValue,\n DataEndpointConfig,\n DataOperationConfig,\n DataOperationIntent,\n DataOperationParameter,\n DataOperationParameterLocation,\n DataOperationRequest,\n DataOperationResponse,\n DataSchema,\n DataSchemaPrimitiveType,\n DataSchemaRegistry,\n DataSourceDiagnostic,\n DataSourceDiagnosticResult,\n EndpointId,\n ExternalRestApiDataSourceConfig,\n OperationId,\n} from '@ankhorage/contracts/data';\n\nconst OPENAPI_HTTP_METHODS = ['delete', 'get', 'head', 'options', 'patch', 'post', 'put'] as const;\nconst DATA_SCHEMA_PRIMITIVES = [\n 'array',\n 'boolean',\n 'integer',\n 'null',\n 'number',\n 'object',\n 'string',\n] as const satisfies readonly DataSchemaPrimitiveType[];\n\nexport type OpenApiHttpMethod = (typeof OPENAPI_HTTP_METHODS)[number];\n\nexport interface OpenApiServerObject {\n readonly url: string;\n readonly description?: string;\n}\n\nexport interface OpenApiSchemaObject {\n readonly $ref?: string;\n readonly type?: string | readonly string[];\n readonly title?: string;\n readonly description?: string;\n readonly enum?: readonly DataContractValue[];\n readonly const?: DataContractValue;\n readonly default?: DataContractValue;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly required?: readonly string[];\n readonly properties?: Readonly<Record<string, OpenApiSchemaObject>>;\n readonly additionalProperties?: boolean | OpenApiSchemaObject;\n readonly items?: OpenApiSchemaObject;\n readonly allOf?: readonly OpenApiSchemaObject[];\n readonly anyOf?: readonly OpenApiSchemaObject[];\n readonly oneOf?: readonly OpenApiSchemaObject[];\n}\n\nexport interface OpenApiMediaTypeObject {\n readonly schema?: OpenApiSchemaObject;\n}\n\nexport interface OpenApiRequestBodyObject {\n readonly description?: string;\n readonly required?: boolean;\n readonly content?: Readonly<Record<string, OpenApiMediaTypeObject>>;\n}\n\nexport interface OpenApiResponseObject {\n readonly description?: string;\n readonly content?: Readonly<Record<string, OpenApiMediaTypeObject>>;\n}\n\nexport interface OpenApiParameterObject {\n readonly name: string;\n readonly in: string;\n readonly required?: boolean;\n readonly description?: string;\n readonly schema?: OpenApiSchemaObject;\n}\n\nexport interface OpenApiOperationObject {\n readonly operationId?: string;\n readonly summary?: string;\n readonly description?: string;\n readonly deprecated?: boolean;\n readonly parameters?: readonly OpenApiParameterObject[];\n readonly requestBody?: OpenApiRequestBodyObject;\n readonly responses?: Readonly<Record<string, OpenApiResponseObject>>;\n}\n\nexport type OpenApiPathItemObject = Partial<Record<OpenApiHttpMethod, OpenApiOperationObject>> & {\n readonly parameters?: readonly OpenApiParameterObject[];\n};\n\nexport interface OpenApiComponentsObject {\n readonly schemas?: Readonly<Record<string, OpenApiSchemaObject>>;\n readonly securitySchemes?: Readonly<Record<string, DataContractValue>>;\n}\n\nexport interface OpenApiDocumentObject {\n readonly openapi?: string;\n readonly info?: {\n readonly title?: string;\n readonly version?: string;\n readonly description?: string;\n };\n readonly servers?: readonly OpenApiServerObject[];\n readonly paths?: Readonly<Record<string, OpenApiPathItemObject>>;\n readonly components?: OpenApiComponentsObject;\n}\n\nexport interface OpenApiImportInput {\n readonly id: string;\n readonly document: OpenApiDocumentObject;\n readonly baseUrl?: string;\n readonly credential?: CredentialRef;\n readonly documentId?: string;\n readonly documentUrl?: string;\n readonly name?: string;\n readonly description?: string;\n readonly metadata?: DataContractValue;\n}\n\nexport type OpenApiImportResult = DataSourceDiagnosticResult<ExternalRestApiDataSourceConfig>;\n\nexport function importOpenApiDocument(input: OpenApiImportInput): OpenApiImportResult {\n const diagnostics: DataSourceDiagnostic[] = [];\n const baseUrl = resolveOpenApiBaseUrl(input, diagnostics);\n const schemas = normalizeOpenApiSchemas(\n input.document.components?.schemas,\n input.id,\n diagnostics,\n );\n const endpoints = normalizeOpenApiEndpoints(input, baseUrl, diagnostics);\n\n if (baseUrl === undefined || diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {\n return { ok: false, diagnostics };\n }\n\n return {\n ok: true,\n data: {\n id: input.id,\n kind: 'api',\n origin: 'external',\n protocol: 'rest',\n name: input.name ?? input.document.info?.title,\n description: input.description ?? input.document.info?.description,\n baseUrl,\n credential: input.credential,\n endpoints,\n schemas,\n openApi: {\n url: input.documentUrl,\n documentId: input.documentId,\n version: input.document.info?.version,\n },\n metadata: input.metadata,\n },\n diagnostics,\n };\n}\n\nexport function normalizeOpenApiOperationId(\n method: OpenApiHttpMethod,\n path: string,\n operationId?: string,\n): OperationId {\n const rawId = operationId ?? `${method}-${path}`;\n const normalized = rawId\n .replace(/\\{([^}]+)\\}/g, '$1')\n .replace(/[^A-Za-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return normalized.length > 0 ? normalized : `${method}-root`;\n}\n\nexport function normalizeOpenApiEndpointId(path: string): EndpointId {\n const normalized = path\n .replace(/\\{([^}]+)\\}/g, '$1')\n .replace(/[^A-Za-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n return normalized.length > 0 ? normalized : 'root';\n}\n\nexport function normalizeOpenApiSchema(schema: OpenApiSchemaObject): DataSchema {\n return {\n ref: normalizeOpenApiSchemaRef(schema.$ref),\n type: normalizeSchemaType(schema.type),\n title: schema.title,\n description: schema.description,\n enum: schema.enum,\n const: schema.const,\n default: schema.default,\n format: schema.format,\n nullable: schema.nullable,\n required: schema.required,\n properties: normalizeSchemaRecord(schema.properties),\n additionalProperties: normalizeAdditionalProperties(schema.additionalProperties),\n items: schema.items === undefined ? undefined : normalizeOpenApiSchema(schema.items),\n allOf: normalizeSchemaList(schema.allOf),\n anyOf: normalizeSchemaList(schema.anyOf),\n oneOf: normalizeSchemaList(schema.oneOf),\n };\n}\n\nfunction resolveOpenApiBaseUrl(\n input: OpenApiImportInput,\n diagnostics: DataSourceDiagnostic[],\n): string | undefined {\n if (input.baseUrl !== undefined && input.baseUrl.trim().length > 0) return input.baseUrl;\n\n const servers = input.document.servers ?? [];\n if (servers.length === 0) {\n diagnostics.push({\n code: 'ambiguous-server',\n dataSourceId: input.id,\n message: 'OpenAPI import requires a server URL or an explicit baseUrl override.',\n path: 'servers',\n severity: 'error',\n });\n return undefined;\n }\n\n if (servers.length > 1) {\n diagnostics.push({\n code: 'ambiguous-server',\n dataSourceId: input.id,\n message: 'OpenAPI document defines multiple servers. The first server URL was selected.',\n path: 'servers',\n severity: 'warning',\n });\n }\n\n return servers[0]?.url;\n}\n\nfunction normalizeOpenApiSchemas(\n schemas: Readonly<Record<string, OpenApiSchemaObject>> | undefined,\n dataSourceId: string,\n diagnostics: DataSourceDiagnostic[],\n): DataSchemaRegistry | undefined {\n if (schemas === undefined) return undefined;\n const registry: Record<string, DataSchema> = {};\n\n for (const [schemaId, schema] of Object.entries(schemas)) {\n registry[schemaId] = normalizeOpenApiSchema(schema);\n collectUnsupportedSchemaDiagnostics(\n schema,\n dataSourceId,\n `components.schemas.${schemaId}`,\n diagnostics,\n );\n }\n return registry;\n}\n\nfunction normalizeOpenApiEndpoints(\n input: OpenApiImportInput,\n baseUrl: string | undefined,\n diagnostics: DataSourceDiagnostic[],\n): Record<EndpointId, DataEndpointConfig> {\n const { paths } = input.document;\n if (paths === undefined || Object.keys(paths).length === 0) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: input.id,\n message: 'OpenAPI document must define at least one path.',\n path: 'paths',\n severity: 'error',\n });\n return {};\n }\n\n const endpoints: Record<EndpointId, DataEndpointConfig> = {};\n const operationIds = new Set<OperationId>();\n\n for (const [path, pathItem] of Object.entries(paths)) {\n const endpointId = normalizeOpenApiEndpointId(path);\n const operations: Record<OperationId, DataOperationConfig> = {};\n\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method];\n if (operation === undefined) continue;\n\n const operationId = resolveUniqueOperationId(\n input.id,\n endpointId,\n method,\n path,\n operation.operationId,\n operationIds,\n diagnostics,\n );\n const parameters = normalizeOpenApiParameters(\n [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])],\n input.id,\n endpointId,\n operationId,\n diagnostics,\n );\n\n operations[operationId] = {\n id: operationId,\n endpointId,\n name: operation.summary,\n description: operation.description,\n protocol: 'http',\n intent: mapOpenApiMethodToIntent(method),\n method: method.toUpperCase(),\n path,\n request: normalizeOpenApiRequest(operation.requestBody, parameters),\n response: normalizeOpenApiResponse(operation.responses),\n metadata: {\n deprecated: operation.deprecated ?? false,\n source: 'openapi',\n },\n };\n }\n\n endpoints[endpointId] = {\n id: endpointId,\n kind: 'http',\n baseUrl,\n path,\n credential: input.credential,\n operations,\n };\n }\n\n return endpoints;\n}\n\nfunction resolveUniqueOperationId(\n dataSourceId: string,\n endpointId: EndpointId,\n method: OpenApiHttpMethod,\n path: string,\n operationId: string | undefined,\n operationIds: Set<OperationId>,\n diagnostics: DataSourceDiagnostic[],\n): OperationId {\n const normalized = normalizeOpenApiOperationId(method, path, operationId);\n if (!operationIds.has(normalized)) {\n operationIds.add(normalized);\n return normalized;\n }\n\n let suffix = 2;\n let uniqueId: OperationId = `${normalized}-${suffix}`;\n while (operationIds.has(uniqueId)) {\n suffix += 1;\n uniqueId = `${normalized}-${suffix}`;\n }\n\n operationIds.add(uniqueId);\n diagnostics.push({\n code: 'duplicate-operation-id',\n dataSourceId,\n endpointId,\n operationId: uniqueId,\n message: `OpenAPI operation id '${normalized}' is duplicated. Normalized to '${uniqueId}'.`,\n path: `paths.${path}.${method}.operationId`,\n severity: 'warning',\n });\n return uniqueId;\n}\n\nfunction normalizeOpenApiParameters(\n parameters: readonly OpenApiParameterObject[],\n dataSourceId: string,\n endpointId: EndpointId,\n operationId: OperationId,\n diagnostics: DataSourceDiagnostic[],\n): readonly DataOperationParameter[] | undefined {\n if (parameters.length === 0) return undefined;\n const normalized: DataOperationParameter[] = [];\n\n for (const parameter of parameters) {\n const location = normalizeParameterLocation(parameter.in);\n if (location === undefined) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId,\n endpointId,\n operationId,\n message: `OpenAPI parameter '${parameter.name}' uses unsupported location '${parameter.in}'.`,\n path: `paths.${endpointId}.parameters.${parameter.name}`,\n severity: 'warning',\n });\n continue;\n }\n\n normalized.push({\n name: parameter.name,\n location,\n required: parameter.required,\n description: parameter.description,\n schema: parameter.schema === undefined ? undefined : normalizeOpenApiSchema(parameter.schema),\n });\n }\n\n return normalized;\n}\n\nfunction normalizeParameterLocation(location: string): DataOperationParameterLocation | undefined {\n if (\n location === 'cookie' ||\n location === 'header' ||\n location === 'path' ||\n location === 'query'\n ) {\n return location;\n }\n return undefined;\n}\n\nfunction normalizeOpenApiRequest(\n requestBody: OpenApiRequestBodyObject | undefined,\n parameters: readonly DataOperationParameter[] | undefined,\n): DataOperationRequest | undefined {\n const content = firstContentEntry(requestBody?.content);\n if (requestBody === undefined && parameters === undefined) return undefined;\n return {\n contentType: content?.contentType,\n parameters,\n schema: content?.schema === undefined ? undefined : normalizeOpenApiSchema(content.schema),\n };\n}\n\nfunction normalizeOpenApiResponse(\n responses: Readonly<Record<string, OpenApiResponseObject>> | undefined,\n): DataOperationResponse | undefined {\n if (responses === undefined) return undefined;\n const status = chooseResponseStatus(Object.keys(responses));\n if (status === undefined) return undefined;\n\n const response = responses[status];\n const content = firstContentEntry(response?.content);\n return {\n status,\n contentType: content?.contentType,\n description: response?.description,\n schema: content?.schema === undefined ? undefined : normalizeOpenApiSchema(content.schema),\n };\n}\n\nfunction firstContentEntry(\n content: Readonly<Record<string, OpenApiMediaTypeObject>> | undefined,\n): { readonly contentType: string; readonly schema?: OpenApiSchemaObject } | undefined {\n if (content === undefined) return undefined;\n const [entry] = Object.entries(content);\n if (entry === undefined) return undefined;\n const [contentType, media] = entry;\n return { contentType, schema: media.schema };\n}\n\nfunction chooseResponseStatus(statuses: readonly string[]): string | undefined {\n return statuses.find((status) => status.startsWith('2')) ?? statuses[0];\n}\n\nfunction mapOpenApiMethodToIntent(method: OpenApiHttpMethod): DataOperationIntent {\n if (method === 'get' || method === 'head') return 'read';\n if (method === 'post') return 'create';\n if (method === 'delete') return 'delete';\n if (method === 'patch' || method === 'put') return 'update';\n return 'action';\n}\n\nfunction normalizeOpenApiSchemaRef(ref: string | undefined): { readonly id: string } | undefined {\n if (ref === undefined) return undefined;\n const prefix = '#/components/schemas/';\n return { id: ref.startsWith(prefix) ? ref.slice(prefix.length) : ref };\n}\n\nfunction normalizeSchemaRecord(\n record: Readonly<Record<string, OpenApiSchemaObject>> | undefined,\n): Readonly<Record<string, DataSchema>> | undefined {\n if (record === undefined) return undefined;\n return Object.fromEntries(\n Object.entries(record).map(([key, schema]) => [key, normalizeOpenApiSchema(schema)]),\n );\n}\n\nfunction normalizeSchemaList(\n list: readonly OpenApiSchemaObject[] | undefined,\n): readonly DataSchema[] | undefined {\n return list?.map(normalizeOpenApiSchema);\n}\n\nfunction normalizeAdditionalProperties(\n value: boolean | OpenApiSchemaObject | undefined,\n): boolean | DataSchema | undefined {\n if (value === undefined || typeof value === 'boolean') return value;\n return normalizeOpenApiSchema(value);\n}\n\nfunction normalizeSchemaType(\n type: string | readonly string[] | undefined,\n): DataSchemaPrimitiveType | readonly DataSchemaPrimitiveType[] | undefined {\n if (type === undefined) return undefined;\n if (typeof type === 'string') return isDataSchemaPrimitive(type) ? type : undefined;\n return type.filter(isDataSchemaPrimitive);\n}\n\nfunction isDataSchemaPrimitive(type: string): type is DataSchemaPrimitiveType {\n return DATA_SCHEMA_PRIMITIVES.some((primitive) => primitive === type);\n}\n\nfunction collectUnsupportedSchemaDiagnostics(\n schema: OpenApiSchemaObject,\n dataSourceId: string,\n path: string,\n diagnostics: DataSourceDiagnostic[],\n): void {\n if (typeof schema.type === 'string' && !isDataSchemaPrimitive(schema.type)) {\n diagnostics.push({\n code: 'unsupported-schema',\n dataSourceId,\n message: `OpenAPI schema type '${schema.type}' is not supported by the normalized schema model.`,\n path: `${path}.type`,\n severity: 'warning',\n });\n }\n\n for (const [propertyName, propertySchema] of Object.entries(schema.properties ?? {})) {\n collectUnsupportedSchemaDiagnostics(\n propertySchema,\n dataSourceId,\n `${path}.properties.${propertyName}`,\n diagnostics,\n );\n }\n if (schema.items !== undefined) {\n collectUnsupportedSchemaDiagnostics(schema.items, dataSourceId, `${path}.items`, diagnostics);\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { CredentialRef, DataContractValue, DataOperationIntent, DataOperationMethod, DataOperationPagination, DataOperationParameter, DataOperationRequest, DataOperationResponse, DataSchemaRegistry, DataSourceDiagnostic, DataSourceDiagnosticResult, EndpointId, OperationId, RestDataSourceConfig } from '@ankhorage/contracts/data';
1
+ import type { CredentialRef, DataContractValue, DataOperationIntent, DataOperationMethod, DataOperationPagination, DataOperationParameter, DataOperationRequest, DataOperationResponse, DataSchemaRegistry, DataSourceDiagnostic, DataSourceDiagnosticResult, EndpointId, ExternalRestApiDataSourceConfig, OperationId } from '@ankhorage/contracts/data';
2
2
  declare const REST_METHODS: readonly ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"];
3
3
  export type ManualRestMethod = (typeof REST_METHODS)[number];
4
4
  export interface ManualRestOperationDefinition {
@@ -38,7 +38,7 @@ export declare function isManualRestMethod(method: string): method is ManualRest
38
38
  export declare function normalizeManualRestMethod(method: string): DataOperationMethod;
39
39
  export declare function extractRestPathParams(path: string): readonly string[];
40
40
  export declare function validateManualRestDataSource(definition: ManualRestDataSourceDefinition): readonly DataSourceDiagnostic[];
41
- export declare function createManualRestDataSource(definition: ManualRestDataSourceDefinition): DataSourceDiagnosticResult<RestDataSourceConfig>;
42
- export declare function normalizeManualRestDataSource(definition: ManualRestDataSourceDefinition): RestDataSourceConfig;
41
+ export declare function createManualRestDataSource(definition: ManualRestDataSourceDefinition): DataSourceDiagnosticResult<ExternalRestApiDataSourceConfig>;
42
+ export declare function normalizeManualRestDataSource(definition: ManualRestDataSourceDefinition): ExternalRestApiDataSourceConfig;
43
43
  export {};
44
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAGjB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,UAAU,EACV,WAAW,EACX,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAEnC,QAAA,MAAM,YAAY,uEAAwE,CAAC;AAE3F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,gBAAgB,CAE7E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAE7E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAgBrE;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,8BAA8B,GACzC,SAAS,oBAAoB,EAAE,CA4EjC;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,8BAA8B,GACzC,0BAA0B,CAAC,oBAAoB,CAAC,CAalD;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,8BAA8B,GACzC,oBAAoB,CA0DtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAGjB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,UAAU,EACV,+BAA+B,EAC/B,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAEnC,QAAA,MAAM,YAAY,uEAAwE,CAAC;AAE3F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,gBAAgB,CAE7E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAE7E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAgBrE;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,8BAA8B,GACzC,SAAS,oBAAoB,EAAE,CA+BjC;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,8BAA8B,GACzC,0BAA0B,CAAC,+BAA+B,CAAC,CAW7D;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,8BAA8B,GACzC,+BAA+B,CAwDjC"}
@@ -44,56 +44,14 @@ export function validateManualRestDataSource(definition) {
44
44
  });
45
45
  }
46
46
  for (const operation of endpoint.operations) {
47
- const normalizedMethod = normalizeManualRestMethod(operation.method);
48
- const operationPath = operation.path ?? endpoint.path;
49
- const templateParams = extractRestPathParams(operationPath);
50
- const pathParameters = operation.parameters?.filter((parameter) => parameter.location === 'path') ?? [];
51
- const pathParameterNames = new Set(pathParameters.map((parameter) => parameter.name));
52
- if (!isManualRestMethod(normalizedMethod)) {
53
- diagnostics.push({
54
- code: 'invalid-config',
55
- dataSourceId: definition.id,
56
- endpointId: endpoint.id,
57
- operationId: operation.id,
58
- message: `Manual REST operation method must be one of ${REST_METHODS.join(', ')}.`,
59
- path: `endpoints.${endpoint.id}.operations.${operation.id}.method`,
60
- severity: 'error',
61
- });
62
- }
63
- for (const templateParam of templateParams) {
64
- if (!pathParameterNames.has(templateParam)) {
65
- diagnostics.push({
66
- code: 'invalid-config',
67
- dataSourceId: definition.id,
68
- endpointId: endpoint.id,
69
- operationId: operation.id,
70
- message: `Path template parameter '${templateParam}' must have a matching path parameter definition.`,
71
- path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters`,
72
- severity: 'error',
73
- });
74
- }
75
- }
76
- for (const pathParameter of pathParameters) {
77
- if (!templateParams.includes(pathParameter.name)) {
78
- diagnostics.push({
79
- code: 'invalid-config',
80
- dataSourceId: definition.id,
81
- endpointId: endpoint.id,
82
- operationId: operation.id,
83
- message: `Path parameter '${pathParameter.name}' is not referenced by the operation path template.`,
84
- path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters.${pathParameter.name}`,
85
- severity: 'error',
86
- });
87
- }
88
- }
47
+ validateManualRestOperation(definition, endpoint, operation, diagnostics);
89
48
  }
90
49
  }
91
50
  return diagnostics;
92
51
  }
93
52
  export function createManualRestDataSource(definition) {
94
53
  const diagnostics = validateManualRestDataSource(definition);
95
- const hasErrors = diagnostics.some((diagnostic) => diagnostic.severity === 'error');
96
- if (hasErrors) {
54
+ if (diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {
97
55
  return { ok: false, diagnostics };
98
56
  }
99
57
  return {
@@ -107,14 +65,10 @@ export function normalizeManualRestDataSource(definition) {
107
65
  for (const endpoint of definition.endpoints) {
108
66
  const operations = {};
109
67
  for (const operation of endpoint.operations) {
110
- const operationPath = operation.path ?? endpoint.path;
111
68
  const { parameters } = operation;
112
69
  const request = operation.request === undefined && parameters === undefined
113
70
  ? undefined
114
- : {
115
- ...operation.request,
116
- parameters,
117
- };
71
+ : { ...operation.request, parameters };
118
72
  operations[operation.id] = {
119
73
  id: operation.id,
120
74
  endpointId: endpoint.id,
@@ -123,7 +77,7 @@ export function normalizeManualRestDataSource(definition) {
123
77
  protocol: 'http',
124
78
  intent: operation.intent,
125
79
  method: normalizeManualRestMethod(operation.method),
126
- path: operationPath,
80
+ path: operation.path ?? endpoint.path,
127
81
  request,
128
82
  response: operation.response,
129
83
  pagination: operation.pagination,
@@ -145,7 +99,9 @@ export function normalizeManualRestDataSource(definition) {
145
99
  }
146
100
  return {
147
101
  id: definition.id,
148
- kind: 'rest',
102
+ kind: 'api',
103
+ origin: 'external',
104
+ protocol: 'rest',
149
105
  name: definition.name,
150
106
  description: definition.description,
151
107
  baseUrl: definition.baseUrl,
@@ -155,4 +111,48 @@ export function normalizeManualRestDataSource(definition) {
155
111
  metadata: definition.metadata,
156
112
  };
157
113
  }
114
+ function validateManualRestOperation(definition, endpoint, operation, diagnostics) {
115
+ const method = normalizeManualRestMethod(operation.method);
116
+ const path = operation.path ?? endpoint.path;
117
+ const templateParams = extractRestPathParams(path);
118
+ const pathParameters = operation.parameters?.filter((parameter) => parameter.location === 'path') ?? [];
119
+ const pathParameterNames = new Set(pathParameters.map((parameter) => parameter.name));
120
+ if (!isManualRestMethod(method)) {
121
+ diagnostics.push({
122
+ code: 'invalid-config',
123
+ dataSourceId: definition.id,
124
+ endpointId: endpoint.id,
125
+ operationId: operation.id,
126
+ message: `Manual REST operation method must be one of ${REST_METHODS.join(', ')}.`,
127
+ path: `endpoints.${endpoint.id}.operations.${operation.id}.method`,
128
+ severity: 'error',
129
+ });
130
+ }
131
+ for (const templateParam of templateParams) {
132
+ if (pathParameterNames.has(templateParam))
133
+ continue;
134
+ diagnostics.push({
135
+ code: 'invalid-config',
136
+ dataSourceId: definition.id,
137
+ endpointId: endpoint.id,
138
+ operationId: operation.id,
139
+ message: `Path template parameter '${templateParam}' must have a matching path parameter definition.`,
140
+ path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters`,
141
+ severity: 'error',
142
+ });
143
+ }
144
+ for (const pathParameter of pathParameters) {
145
+ if (templateParams.includes(pathParameter.name))
146
+ continue;
147
+ diagnostics.push({
148
+ code: 'invalid-config',
149
+ dataSourceId: definition.id,
150
+ endpointId: endpoint.id,
151
+ operationId: operation.id,
152
+ message: `Path parameter '${pathParameter.name}' is not referenced by the operation path template.`,
153
+ path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters.${pathParameter.name}`,
154
+ severity: 'error',
155
+ });
156
+ }
157
+ }
158
158
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CredentialRef,\n DataContractValue,\n DataEndpointConfig,\n DataOperationConfig,\n DataOperationIntent,\n DataOperationMethod,\n DataOperationPagination,\n DataOperationParameter,\n DataOperationRequest,\n DataOperationResponse,\n DataSchemaRegistry,\n DataSourceDiagnostic,\n DataSourceDiagnosticResult,\n EndpointId,\n OperationId,\n RestDataSourceConfig,\n} from '@ankhorage/contracts/data';\n\nconst REST_METHODS = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'] as const;\n\nexport type ManualRestMethod = (typeof REST_METHODS)[number];\n\nexport interface ManualRestOperationDefinition {\n readonly id: OperationId;\n readonly intent: DataOperationIntent;\n readonly method: string;\n readonly name?: string;\n readonly description?: string;\n readonly path?: string;\n readonly credential?: CredentialRef;\n readonly parameters?: readonly DataOperationParameter[];\n readonly request?: DataOperationRequest;\n readonly response?: DataOperationResponse;\n readonly pagination?: DataOperationPagination;\n readonly metadata?: DataContractValue;\n}\n\nexport interface ManualRestEndpointDefinition {\n readonly id: EndpointId;\n readonly path: string;\n readonly name?: string;\n readonly description?: string;\n readonly credential?: CredentialRef;\n readonly operations: readonly ManualRestOperationDefinition[];\n readonly metadata?: DataContractValue;\n}\n\nexport interface ManualRestDataSourceDefinition {\n readonly id: string;\n readonly baseUrl: string;\n readonly name?: string;\n readonly description?: string;\n readonly credential?: CredentialRef;\n readonly endpoints: readonly ManualRestEndpointDefinition[];\n readonly schemas?: DataSchemaRegistry;\n readonly metadata?: DataContractValue;\n}\n\nexport function isManualRestMethod(method: string): method is ManualRestMethod {\n return REST_METHODS.some((restMethod) => restMethod === method);\n}\n\nexport function normalizeManualRestMethod(method: string): DataOperationMethod {\n return method.toUpperCase();\n}\n\nexport function extractRestPathParams(path: string): readonly string[] {\n const params = new Set<string>();\n const bracedParamPattern = /\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\n const colonParamPattern = /(^|\\/):([A-Za-z_][A-Za-z0-9_]*)/g;\n\n for (const match of path.matchAll(bracedParamPattern)) {\n const [, param] = match;\n if (param !== undefined) params.add(param);\n }\n\n for (const match of path.matchAll(colonParamPattern)) {\n const [, , param] = match;\n if (param !== undefined) params.add(param);\n }\n\n return [...params];\n}\n\nexport function validateManualRestDataSource(\n definition: ManualRestDataSourceDefinition,\n): readonly DataSourceDiagnostic[] {\n const diagnostics: DataSourceDiagnostic[] = [];\n\n if (definition.baseUrl.trim().length === 0) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n message: 'Manual REST data source requires a non-empty baseUrl.',\n path: 'baseUrl',\n severity: 'error',\n });\n }\n\n for (const endpoint of definition.endpoints) {\n if (!endpoint.path.startsWith('/')) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n message: 'Manual REST endpoint paths must start with `/`.',\n path: `endpoints.${endpoint.id}.path`,\n severity: 'error',\n });\n }\n\n for (const operation of endpoint.operations) {\n const normalizedMethod = normalizeManualRestMethod(operation.method);\n const operationPath = operation.path ?? endpoint.path;\n const templateParams = extractRestPathParams(operationPath);\n const pathParameters =\n operation.parameters?.filter((parameter) => parameter.location === 'path') ?? [];\n const pathParameterNames = new Set(pathParameters.map((parameter) => parameter.name));\n\n if (!isManualRestMethod(normalizedMethod)) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n operationId: operation.id,\n message: `Manual REST operation method must be one of ${REST_METHODS.join(', ')}.`,\n path: `endpoints.${endpoint.id}.operations.${operation.id}.method`,\n severity: 'error',\n });\n }\n\n for (const templateParam of templateParams) {\n if (!pathParameterNames.has(templateParam)) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n operationId: operation.id,\n message: `Path template parameter '${templateParam}' must have a matching path parameter definition.`,\n path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters`,\n severity: 'error',\n });\n }\n }\n\n for (const pathParameter of pathParameters) {\n if (!templateParams.includes(pathParameter.name)) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n operationId: operation.id,\n message: `Path parameter '${pathParameter.name}' is not referenced by the operation path template.`,\n path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters.${pathParameter.name}`,\n severity: 'error',\n });\n }\n }\n }\n }\n\n return diagnostics;\n}\n\nexport function createManualRestDataSource(\n definition: ManualRestDataSourceDefinition,\n): DataSourceDiagnosticResult<RestDataSourceConfig> {\n const diagnostics = validateManualRestDataSource(definition);\n const hasErrors = diagnostics.some((diagnostic) => diagnostic.severity === 'error');\n\n if (hasErrors) {\n return { ok: false, diagnostics };\n }\n\n return {\n ok: true,\n data: normalizeManualRestDataSource(definition),\n diagnostics,\n };\n}\n\nexport function normalizeManualRestDataSource(\n definition: ManualRestDataSourceDefinition,\n): RestDataSourceConfig {\n const endpoints: Record<EndpointId, DataEndpointConfig> = {};\n\n for (const endpoint of definition.endpoints) {\n const operations: Record<OperationId, DataOperationConfig> = {};\n\n for (const operation of endpoint.operations) {\n const operationPath = operation.path ?? endpoint.path;\n const { parameters } = operation;\n const request: DataOperationRequest | undefined =\n operation.request === undefined && parameters === undefined\n ? undefined\n : {\n ...operation.request,\n parameters,\n };\n\n operations[operation.id] = {\n id: operation.id,\n endpointId: endpoint.id,\n name: operation.name,\n description: operation.description,\n protocol: 'http',\n intent: operation.intent,\n method: normalizeManualRestMethod(operation.method),\n path: operationPath,\n request,\n response: operation.response,\n pagination: operation.pagination,\n credential: operation.credential,\n metadata: operation.metadata,\n };\n }\n\n endpoints[endpoint.id] = {\n id: endpoint.id,\n kind: 'http',\n name: endpoint.name,\n description: endpoint.description,\n baseUrl: definition.baseUrl,\n path: endpoint.path,\n credential: endpoint.credential,\n operations,\n metadata: endpoint.metadata,\n };\n }\n\n return {\n id: definition.id,\n kind: 'rest',\n name: definition.name,\n description: definition.description,\n baseUrl: definition.baseUrl,\n credential: definition.credential,\n endpoints,\n schemas: definition.schemas,\n metadata: definition.metadata,\n };\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CredentialRef,\n DataContractValue,\n DataEndpointConfig,\n DataOperationConfig,\n DataOperationIntent,\n DataOperationMethod,\n DataOperationPagination,\n DataOperationParameter,\n DataOperationRequest,\n DataOperationResponse,\n DataSchemaRegistry,\n DataSourceDiagnostic,\n DataSourceDiagnosticResult,\n EndpointId,\n ExternalRestApiDataSourceConfig,\n OperationId,\n} from '@ankhorage/contracts/data';\n\nconst REST_METHODS = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'] as const;\n\nexport type ManualRestMethod = (typeof REST_METHODS)[number];\n\nexport interface ManualRestOperationDefinition {\n readonly id: OperationId;\n readonly intent: DataOperationIntent;\n readonly method: string;\n readonly name?: string;\n readonly description?: string;\n readonly path?: string;\n readonly credential?: CredentialRef;\n readonly parameters?: readonly DataOperationParameter[];\n readonly request?: DataOperationRequest;\n readonly response?: DataOperationResponse;\n readonly pagination?: DataOperationPagination;\n readonly metadata?: DataContractValue;\n}\n\nexport interface ManualRestEndpointDefinition {\n readonly id: EndpointId;\n readonly path: string;\n readonly name?: string;\n readonly description?: string;\n readonly credential?: CredentialRef;\n readonly operations: readonly ManualRestOperationDefinition[];\n readonly metadata?: DataContractValue;\n}\n\nexport interface ManualRestDataSourceDefinition {\n readonly id: string;\n readonly baseUrl: string;\n readonly name?: string;\n readonly description?: string;\n readonly credential?: CredentialRef;\n readonly endpoints: readonly ManualRestEndpointDefinition[];\n readonly schemas?: DataSchemaRegistry;\n readonly metadata?: DataContractValue;\n}\n\nexport function isManualRestMethod(method: string): method is ManualRestMethod {\n return REST_METHODS.some((restMethod) => restMethod === method);\n}\n\nexport function normalizeManualRestMethod(method: string): DataOperationMethod {\n return method.toUpperCase();\n}\n\nexport function extractRestPathParams(path: string): readonly string[] {\n const params = new Set<string>();\n const bracedParamPattern = /\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\n const colonParamPattern = /(^|\\/):([A-Za-z_][A-Za-z0-9_]*)/g;\n\n for (const match of path.matchAll(bracedParamPattern)) {\n const [, param] = match;\n if (param !== undefined) params.add(param);\n }\n\n for (const match of path.matchAll(colonParamPattern)) {\n const [, , param] = match;\n if (param !== undefined) params.add(param);\n }\n\n return [...params];\n}\n\nexport function validateManualRestDataSource(\n definition: ManualRestDataSourceDefinition,\n): readonly DataSourceDiagnostic[] {\n const diagnostics: DataSourceDiagnostic[] = [];\n\n if (definition.baseUrl.trim().length === 0) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n message: 'Manual REST data source requires a non-empty baseUrl.',\n path: 'baseUrl',\n severity: 'error',\n });\n }\n\n for (const endpoint of definition.endpoints) {\n if (!endpoint.path.startsWith('/')) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n message: 'Manual REST endpoint paths must start with `/`.',\n path: `endpoints.${endpoint.id}.path`,\n severity: 'error',\n });\n }\n\n for (const operation of endpoint.operations) {\n validateManualRestOperation(definition, endpoint, operation, diagnostics);\n }\n }\n\n return diagnostics;\n}\n\nexport function createManualRestDataSource(\n definition: ManualRestDataSourceDefinition,\n): DataSourceDiagnosticResult<ExternalRestApiDataSourceConfig> {\n const diagnostics = validateManualRestDataSource(definition);\n if (diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {\n return { ok: false, diagnostics };\n }\n\n return {\n ok: true,\n data: normalizeManualRestDataSource(definition),\n diagnostics,\n };\n}\n\nexport function normalizeManualRestDataSource(\n definition: ManualRestDataSourceDefinition,\n): ExternalRestApiDataSourceConfig {\n const endpoints: Record<EndpointId, DataEndpointConfig> = {};\n\n for (const endpoint of definition.endpoints) {\n const operations: Record<OperationId, DataOperationConfig> = {};\n\n for (const operation of endpoint.operations) {\n const { parameters } = operation;\n const request: DataOperationRequest | undefined =\n operation.request === undefined && parameters === undefined\n ? undefined\n : { ...operation.request, parameters };\n\n operations[operation.id] = {\n id: operation.id,\n endpointId: endpoint.id,\n name: operation.name,\n description: operation.description,\n protocol: 'http',\n intent: operation.intent,\n method: normalizeManualRestMethod(operation.method),\n path: operation.path ?? endpoint.path,\n request,\n response: operation.response,\n pagination: operation.pagination,\n credential: operation.credential,\n metadata: operation.metadata,\n };\n }\n\n endpoints[endpoint.id] = {\n id: endpoint.id,\n kind: 'http',\n name: endpoint.name,\n description: endpoint.description,\n baseUrl: definition.baseUrl,\n path: endpoint.path,\n credential: endpoint.credential,\n operations,\n metadata: endpoint.metadata,\n };\n }\n\n return {\n id: definition.id,\n kind: 'api',\n origin: 'external',\n protocol: 'rest',\n name: definition.name,\n description: definition.description,\n baseUrl: definition.baseUrl,\n credential: definition.credential,\n endpoints,\n schemas: definition.schemas,\n metadata: definition.metadata,\n };\n}\n\nfunction validateManualRestOperation(\n definition: ManualRestDataSourceDefinition,\n endpoint: ManualRestEndpointDefinition,\n operation: ManualRestOperationDefinition,\n diagnostics: DataSourceDiagnostic[],\n): void {\n const method = normalizeManualRestMethod(operation.method);\n const path = operation.path ?? endpoint.path;\n const templateParams = extractRestPathParams(path);\n const pathParameters =\n operation.parameters?.filter((parameter) => parameter.location === 'path') ?? [];\n const pathParameterNames = new Set(pathParameters.map((parameter) => parameter.name));\n\n if (!isManualRestMethod(method)) {\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n operationId: operation.id,\n message: `Manual REST operation method must be one of ${REST_METHODS.join(', ')}.`,\n path: `endpoints.${endpoint.id}.operations.${operation.id}.method`,\n severity: 'error',\n });\n }\n\n for (const templateParam of templateParams) {\n if (pathParameterNames.has(templateParam)) continue;\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n operationId: operation.id,\n message: `Path template parameter '${templateParam}' must have a matching path parameter definition.`,\n path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters`,\n severity: 'error',\n });\n }\n\n for (const pathParameter of pathParameters) {\n if (templateParams.includes(pathParameter.name)) continue;\n diagnostics.push({\n code: 'invalid-config',\n dataSourceId: definition.id,\n endpointId: endpoint.id,\n operationId: operation.id,\n message: `Path parameter '${pathParameter.name}' is not referenced by the operation path template.`,\n path: `endpoints.${endpoint.id}.operations.${operation.id}.parameters.${pathParameter.name}`,\n severity: 'error',\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-runner/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAIjB,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAClF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;CAC1C;AAED,MAAM,MAAM,8BAA8B,GAAG,CAC3C,UAAU,EAAE,aAAa,KACtB,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,qBAAqB,KACxB,OAAO,CAAC,yBAAyB,CAAC,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,8BAA8B,CAAC;CAC9D;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;CACzC;AAED,MAAM,MAAM,kBAAkB,GAC1B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,OAAO,CAAC,EAAE,6BAA6B,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACvD,CAAC;AAON,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+CxF;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA6B7B"}